Pergunta

Como um exemplo, eu tenho um modelo de grupo e modelo de usuário

eles estão conectados com: has_many,: através => groups_users

mesa groups_users tem um atributo, chamado de moderador, especificando se um usuário é um moderador do grupo

pergunta: Como posso acessar todos os moderadores de um determinado grupo

depois de ler sobre: ??with_scope, o que vem à mente é

def find_moderators
 Group.with_scope(:find=>{:conditions => "moderator=1"})
   @moderators=@group.users
 end
end

No entanto, após rails 2, with_scope fica protegida, e não permite que determinado código no controlador, então o que é a boa alternativa para isso?

Foi útil?

Solução

resolvido com

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

Preferenciais a resposta de Matt Van Horn porque este produz apenas uma consulta quando seleccionar informação do usuário com @ group.moderators, enquanto sua solução dá consulta separada para cada moderador

edit: atualizado para a pergunta de resposta Sizzlepants. moderadores criados com este código deve ter atributo moderador em juntar set modelo para true (Rails usa: condições ao criar juntar modelo)., também, se eu teria de código-lo agora, eu iria nomear groups_users membros para facilitar a leitura

Outras dicas

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

Monkeypatch!

class Group < ActiveRecord::Base
   public :with_scope
end
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top