2009-12-08 23 views
1

Ce doit être un problème très commun. J'ai beaucoup à many enchaîné comme ceci:Enchaîné has_many à travers: users -> roles -> lists. Trouver les listes auxquelles un utilisateur est assigné (via les rôles)

utilisateur n < ==> n Rôle n < ==> Liste n

modèles ActiveRecord:

class User 
    # linking to roles 
    has_many :role_assignments 
    has_many :roles, :through => :role_assignments 
end 

class Role 
    # linking back to users 
    has_many :role_assignments 
    has_many :users, :through => :role_assignments 

    # linking to lists 
    has_many :list_assignments 
    has_many :lists, :through => :list_assignments 
end 

class List 
    # linking back to roles 
    has_many :list_assignments 
    has_many :roles, :through => :list_assignments 
end 

# ... and the join models: 
class RoleAssignment 
    belongs_to :role 
    belongs_to :user 
end 

class ListAssignment 
    belongs_to :list 
    belongs_to :role 
end 

Que serait une named_scope ou une association dans le modèle List pour trouver toutes les listes qui ont tous les rôles qui à leur tour ont un utilisateur spécifique?

Tout indice serait grandement apprécié!

+0

Où sont les modèles role_assignments et list_assignments? Vous avez besoin des déclarations belongs_to sur la (les) table (s) de jointure. – bensie

+0

J'ai omis ceux pour la concision, mais votre question me fait penser que je devrais les ajouter aussi. – mxgrn

Répondre

0

La meilleure solution que je pourrais trouver est à ce jour les éléments suivants:

class List 
    has_many :list_assignments 
    has_many :roles, :through => :list_assignments 

    named_scope :managable_by_user, lambda { |u| 
    role_ids = u.roles.map(&:id) 
    { 
     :include => [:list_assignments], 
     :conditions => {:list_assignments => {:role_id => role_ids}} 
    } 
    } 
end