代码之家  ›  专栏  ›  技术社区  ›  Sniffer

RubyonRails中的数据库和模型设置

  •  2
  • Sniffer  · 技术社区  · 15 年前

    我对Ruby中的数据库设置还很陌生,需要帮助来正确地设置它和模型。有人能帮忙吗?

    基本上我有一个组织,至少有两种类型的用户-成员和管理用户。组织和用户都有地址。

    我认为这基本上是三张表——组织、用户和地址,但在考虑模型和外键时,我真的很困惑。

    有人能建议最好的组织方式吗?

    我在用MySQL数据库运行Rails3。

    谢谢你抽出时间

    嗅探器

    2 回复  |  直到 15 年前
        1
  •  5
  •   Jaime Bellmyer    15 年前

    我很喜欢亚当·坦纳的回答,但我会把它设置得有点不同。首先,一个组织与管理员的关联方式并不像描述的那样工作-您必须在用户表中有一个不同的外键,并在 has_one :admin 联想。但我不认为这是一条好的路径,因为它限制了每个组织只有一个管理员,并且限制了属于一个组织的用户。

    我的版本稍微复杂一点,但我认为它能很好地完成工作。首先,管理员应该是用户在组织中拥有或不拥有的角色。我将首先解决用户/组织问题,然后保存地址问题供以后使用。

    以下是迁移,您可以使用它们需要的任何其他字段来增强迁移:

    create_table :organizations do |t|
      # your fields go here
    end
    
    create_table :users do |t|
      # your fields go here
    end
    
    create_table :memberships do |t|
      t.integer :user_id
      t.integer :organization_id
      t.boolean :is_admin
    end
    
    add_index :memberships, [:user_id, :organization_id]
    

    如您所见,我们正在添加一个成员资格表,它将连接用户和组织。我们还添加了一个索引来稍微加速关联。现在,对于模型:

    class Organization < ActiveRecord::Base
      has_many :memberships
      has_many :users, :through => :memberships
    end
    
    class User < ActiveRecord::Base
      has_many :memberships
      has_many :organizations, :through => :memberships
    
      def membership_in organization
        self.memberships.detect{|m| m.organization = organization}
      end
    
      def is_admin_for? organization
        self.membership_in(organization).is_admin?
      end
    
      def set_admin_for organization, value
       self.membership_in(organization).update_attribute(:is_admin, value)
      end
    end
    
    class Membership < ActiveRecord::Base
      belongs_to :organization
      belongs_to :user
    end
    

    在这里,我们通过会员资格来连接我们的用户和组织。用户可以是他们所属的任何组织的管理员。我已经创建了一些方法来设置和获取组织中用户在用户模型中的管理状态。

    接下来是地址:我已经在我的一篇博客文章中讨论过这个问题:

    http://kconrails.com/2010/10/19/common-addresses-using-polymorphism-and-nested-attributes-in-rails/

    如果您有任何问题,请提问。祝你好运!

    更新

    Edward M.Smith在评论中指出,我的管理方法不是很容错。例如,我试图尽可能保持代码的整洁,但他有一个观点。所以这里有一个更强大的版本,解释了如何在一个组织中使用会员,用户 不是 部分:

      def is_admin_for? organization
        membership = self.membership_in(organization)
        return false if membership.nil?
    
        membership.is_admin?
      end
    
      def set_admin_for organization, value
        membership = self.membership_in(organization)
        return false if membership.nil?
    
       membership.update_attribute(:is_admin, value)
      end
    

    和往常一样,测试驱动的开发是最好的,但我通常没有时间来解决stackoverflow问题。)

        2
  •  2
  •   Adam Tanner    15 年前
    class Organization < ActiveRecord::Base
      has_one :address, :as => :addressable
      has_many :members, :class_name => "User"
    end
    
     class User < ActiveRecord::Base
       has_one :address, :as => :addressable
       belongs_to :organization
     end
    
     class Address < ActiveRecord::Base
       belongs_to :addressable, :polymorphic => true
     end
    

    我已经删除了管理关联,部分原因是它无论如何都不起作用,主要是因为正如Jaime所说,这样做是错误的(大多数开发人员使用某种角色系统)。有关创建可扩展角色系统的好方法,请参阅Jaime的帖子。

    希望这能帮到你!

    推荐文章