复杂的has_many关系和Rails

时间:2011-04-01 15:14:33

标签: ruby-on-rails activerecord

我有一些帐户和用户,目前已脱节。

我需要用户能够成为管理员,编辑或任何(和许多)帐户。

目前,我有这个:

account.rb

has_many :memberships, :dependent => :destroy
  has_many :administrators, :through => :memberships, :source => :user, :conditions => {'memberships.is_admin' => true} 
  has_many :editors, :through => :memberships, :source => :user, :conditions => {'memberships.is_editor' => true} 

user.rb

has_many :memberships
  has_many :accounts, :through => :memberships
  has_many :editor_accounts, :through => :memberships, :source => :account, :conditions => {'memberships.is_editor' => true}
  has_many :administrator_accounts, :through => :memberships, :source => :account, :conditions => {'memberships.is_admin' => true}

基本上,我想要实现的是一种简单的建模方法,它以一种简单的方式工作。例如,能够执行以下操作非常有用:

@account.administrators << current_user
current_user.adminstrator_accounts = [..]

1 个答案:

答案 0 :(得分:1)

您应该可以这样做,但可能是您使用的符号干扰自动范围应用程序:

has_many :memberships,
  :dependent => :destroy
has_many :administrators,
  :through => :memberships,
  :source => :user,
  :conditions => { :is_admin => true }

当且仅当条件键与关联上的列名匹配时,才应用条件。只要users表没有is_admin列,就可以了。

作为一个注释,对于这样的事情有多个布尔标志可能很尴尬。是否可能成为管理员和编辑?使用简单的角色列可能会更好,然后使用它:

has_many :administrators,
  :through => :memberships,
  :source => :user,
  :conditions => { :role => 'admin' }

从索引角度来看,多用途列通常比多个单用途列更好。您必须为这些is_admin类型的列中的每一个编制索引,并且通常需要为多个键执行此操作。这可能会很匆忙。