usando juntar-se modelo de atributos em trilhos has_many: through
-
18-09-2019 - |
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?
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