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?

Était-ce utile?

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
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top