Attributs du modèle à l'aide se joindre dans des rails has_many: par
-
18-09-2019 - |
Question
à titre d'exemple, j'ai un groupe de modèle et le modèle utilisateur
ils sont connectés avec: has_many,: par => groups_users
table groups_users a un attribut, appelé modérateur, en précisant si un utilisateur est un modérateur du groupe
question: Comment accéder tous les modérateurs d'un groupe donné
après avoir lu: with_scope, ce qui vient à l'esprit est
def find_moderators
Group.with_scope(:find=>{:conditions => "moderator=1"})
@moderators=@group.users
end
end
Cependant, après 2 rails, with_scope devient protégée et ne permet pas de code donné dans le contrôleur, alors quelle est la bonne alternative à cela?
La solution
résolu avec
class Group
has_many :groups_users
has_many :moderatorships, :class_name => "GroupsUser",:conditions => {:moderator => true}
has_many :moderators, :through => :moderatorships, :class_name => "User", :source => :user
end
Préférée à la réponse de Matt van Horn parce que celui-ci ne produit qu'une seule requête lorsque nous sélectionnons informations utilisateur @ group.moderators, tandis que sa solution donne requête distincte pour chaque modérateur
edit: mise à jour pour répondre à la question de Sizzlepants. modérateurs créés avec ce code devrait avoir modérateur attribut joindre modèle à true (rails utilise: conditions tout en créant des join modèle), aussi, si je dois coder maintenant, je nommeriez les adhésions de groups_users pour une meilleure lisibilité
Autres conseils
class User
has_many :group_users
has_many :groups, :through => :groups_users
end
class GroupUser
belongs_to :user
belongs_to :group
named_scope :as_moderator, :conditions => "moderator=1"
end
class Group
has_many :group_users
has_many :groups, :through => :groups_users
def moderators
group_users.as_moderator.map{|gu|gu.user}
end
end
# use it:
@moderators = @group.moderators
or
@all_mods = Group.all.map{|g|g.moderators}.flatten
monkey-patch!
class Group < ActiveRecord::Base
public :with_scope
end