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.
Malheureusement, cela ne fonctionne pas. – uberllama
Quelque chose de similaire fonctionne, mais c'est vraiment moche: user.memberships.active.all (: include =>: groupe) .collect (&: groupe) – uberllama
Bien sûr ... mon erreur! Vous avez besoin de la partie 'collect'. Ce n'est vraiment pas très beau ... –