3

表面が非常にシンプルなもので、壁に頭をぶつけてきました。次の簡略化されたモデルがあるとしましょう。

user.rb

has_many :memberships  
has_many :groups, :through => :memberships

membership.rb

belongs_to :group  
belongs_to :user  
STATUS_CODES = {:admin => 1, :member => 2, :invited => 3}  
named_scope :active, :conditions => {:status => [[STATUS_CODES[:admin], STATUS_CODES[:member]]}

group.rb

has_many :memberships  
has_many :users, :through => :memberships

簡単ですよね?したがって、私がやりたいのは、結合モデルの既存の名前付きスコープを使用して、ユーザーがアクティブになっているすべてのグループのコレクションを取得することです。User.find(1).groups.activeに沿った何か。明らかに、これは機能しません。

User.find(1).membrships.active.all(:include => :group)しかし、現状では、メンバーシップとグループのコレクションを返すようなことをする必要があります。私はそれを望んでいません。

Membershipモデルの:active named_scopeを複製する条件で、Userモデルに別のhas_manyを追加できることは知っていますが、それはひどいことです。

has_many :active_groups, :through => :memberships, :source => :group, :conditions => ...

だから私の質問:モデル間を直接トラバースするときに中間の名前付きスコープを使用する方法はありますか?どうもありがとう。

4

1 に答える 1

0

使えると思います

User.find(1).memberships.active.collect(&:group)

これにより、このユーザーがアクティブになっているすべてのグループが返されます。

于 2010-05-06T20:25:31.283 に答える