Mysql RubyonRails中的数据库和模型设置

Mysql RubyonRails中的数据库和模型设置,mysql,ruby-on-rails,model,Mysql,Ruby On Rails,Model,我对Ruby中的数据库设置非常陌生,需要帮助来正确设置它和模型。有人能帮忙吗 基本上我有一个组织,其中将有至少两种类型的用户-会员和管理员用户。组织和用户都有地址 我原以为这基本上是三张表——组织、用户和地址,但在考虑模型和外键时,我真的很困惑 有谁能建议最好的组织方式吗 我正在使用mySql数据库运行Rails 3 谢谢你的时间 嗅探器类组织:addressable 拥有多个:成员,:class\u name=>“用户” 结束 类用户:addressable 属于:组织 结束 类地址true

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

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

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

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

我正在使用mySql数据库运行Rails 3

谢谢你的时间

嗅探器
类组织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
has_one:address,:as=>:addressable 拥有多个:成员,:class\u name=>“用户” 结束 类用户:addressable 属于:组织 结束 类地址true 结束 我删除了管理员协会,部分原因是它无论如何都不起作用,主要原因是正如Jaime所说的那样,这样做是错误的(大多数开发人员使用某种角色系统)。有关创建可扩展角色系统的好方法,请参见Jaime的帖子


希望这对你有帮助

我喜欢亚当·坦纳的很多答案,但我会把它设置得稍微不同一点。首先,一个组织与管理员关联的方式并不像所描述的那样工作-您必须在用户表中有一个不同的外键,并在
中指定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]
如您所见,我们正在添加一个memberships表,它将连接用户和组织。我们还添加了一个索引,以稍微加快关联速度。现在,对于模型:

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

和往常一样,测试驱动开发是最好的,但我通常没有时间为stackoverflow问题这样做:)

谢谢你的回答。查看了一些参考文献后:多态属性是有意义的。我只是有点困惑如何设置我的数据库(对不起,我是新手!)。我认为Organization将有以下字段id,orgname和User将有字段id,username,Organization\u id。但我在地址表上感到困惑,这是否应该有Organization\u id和User\u id的外键字段?这是否意味着我必须为每个重新获取地址的对象添加一个外键字段?或者在数据库中有两个新表,分别称为UserAddress(带有address\u Id和user\u Id)和OrgAddresses(带有address\u Id和org\u Id)。如果是这样的话,您如何在模型中装配它们?对于组织和用户表,您是正确的。多态性在Rails中的工作方式是地址表将有一个可寻址的\u id列和一个可寻址的\u类型列。addressable_id列保存用户/组织/任意对象的id,addressable_type是一个字符串,它保存对象类型的类名,例如“User”/“Organization”/“Whatever”,以便在将其从数据库中取出时知道实例化哪个类。您可以使用
t在迁移中自动创建这些列。references:addressable,:polymorphic=>true
。谢谢Adam,但是Jaime更冗长的回答值得一提。非常感谢你为回答这个问题所做的努力+1.来自rails/ruby noob的问题。”membership_in'返回nil或组织实例,对吗?在is_admin_上发生什么?在用户不在组织中时呼叫?是不是打电话叫“管理员”?在nil上,因此出现了错误?非常正确,这是我为stackoverflow答案输入的大量代码,因此我没有像处理代码那样内置很多容错功能,或者使用TDD:)很好,我会纠正它。哦,我没有批评。我仍在努力理解Ruby(例如,必须在集合上查找“detect”方法),所以我想知道我是否正确理解了事物。:)非常感谢你冗长的回复,詹姆。。这太棒了。非常感谢您回到这里,并补充澄清爱德华的评论。
  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