2011-03-07 6 views
1

Mon modèle d'utilisateur ressemble à:Puis-je ajouter une association basée sur une autre association?

User 
    habtm :Roles 


Role 
    habtm :Users 


RoleExtension 
    belongs_to :Role 

tables MySQL:

users 
    id 
    .. 


roles 
    id 
    .. 

roles_users 
    user_id 
    role_id 

role_extensions 
    id 
    role_id 
    feature_id 
    .. 
    .. 

Maintenant, tout semble fonctionner très bien jusqu'à présent.

Maintenant, je veux que le modèle utilisateur dispose d'une collection de RoleExtensions, basée sur la collection de rôles habtm.

exemple:

user = User.find(1) 
user.Roles (returns roles with id's of 1,2,3) 

Je veux:

user.RoleExtensions 

retourner toutes les extensions de rôle qui ont ROLE_ID dans (1,2,3)

+0

user.roles.role_extensions? – corroded

+0

user.Role [0] .RoleExtensions fonctionne, mais je veux que toutes les extensions de rôle ne soient pas seulement l'extension de rôle pour un rôle particulier. – Blankman

Répondre

1

Normalement vous utilisez une association has_many, :through, mais qui ne concerne pas les relations has_and_belongs_to_many.

Ainsi, au lieu, dans votre modèle utilisateur:

def role_extensions 
    return roles.inject([]) do |array, role| 
    role.role_extensions do |re| 
     array.include?(re) ? array << re : array 
    end 
    end 
end 

Puis my_user.role_extensions retourne un tableau de toutes les extensions de rôle appartenant à tous les rôles de l'utilisateur.

Note: Je n'ai pas testé, mais il devrait fonctionner

MISE À JOUR: J'aime mieux

def role_extensions 
    return roles.inject([]) { |array, role| array << role.role_extensions }.flatten!.uniq 
end 
+0

ok bien en fait la question précédente vous avez répondu pour moi répondu (je l'ai fait de cette façon à la place), mais j'espérais que je faisais quelque chose de mal dans mes associations que je voulais comprendre cela! – Blankman

0
 
user = User.find(1) 
RoleExtension.find(:all, :conditions => ["role_id IN (?)", user.role_ids]) 

Sinon, vous peut utiliser des jointures imbriquées.

+0

Comment puis-je en faire un utilisateur associé? comment obtenir des role_ids? Je suis nouveau à ça! – Blankman

0

Essayez ceci -

# Fetch user object 
user = User.first 

# If you want roles of that user try this 
roles = user.roles 

# You can map all the role extensions of that user by 
role_extensions = user.roles.map(&:role_extensions).uniq 

Soyez conscient que ce sera extrêmement lent pour un grand nombre de rôles. Dans ce cas, mieux écrire votre propre méthode de requête. Quelque chose comme

role_extensions = RoleExtension.where("role_id in (?)", user.role_ids).all 
0
@user.role_extensions.where(:joins => :roles) 
+0

serait-ce @ user.RoleExtensions ou @ user.role_extensions, confus? – Blankman

Questions connexes