2010-05-06 14 views
3

Je me suis cogné la tête contre le mur sur quelque chose qui devrait être très simple sur la surface. Disons que je les modèles simplifiés suivants:En utilisant named_scopes sur le modèle de jointure d'un has_many: à travers

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 

Simple, non? Donc, ce que je veux faire est d'obtenir une collection de tous les groupes dans lesquels un utilisateur est actif, en utilisant la portée nommée existante sur le modèle de jointure. Quelque chose dans le genre de User.find (1) .groups.active. Évidemment, cela ne fonctionne pas. Mais pour l'instant, j'ai besoin de faire quelque chose comme User.find(1).membrships.active.all(:include => :group) qui retourne une collection d'appartenances plus des groupes. Je ne veux pas ça.

Je sais que je peux ajouter un autre has_many sur le modèle User avec des conditions qui dupliquent: active_scope sur le modèle Membership, mais c'est grossier. Donc, ma question: existe-t-il une façon d'utiliser des étendues nommées intermédiaires lors de la traversée directe entre les modèles? Merci beaucoup.

Répondre

0

Je crois que vous pouvez utiliser

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

et ce retournerez tous les groupes auxquels cet utilisateur est actif dans.

+0

Malheureusement, cela ne fonctionne pas. – uberllama

+0

Quelque chose de similaire fonctionne, mais c'est vraiment moche: user.memberships.active.all (: include =>: groupe) .collect (&: groupe) – uberllama

+0

Bien sûr ... mon erreur! Vous avez besoin de la partie 'collect'. Ce n'est vraiment pas très beau ... –