Acessando valores em um has_many: através da tabela de junção
-
20-09-2019 - |
Pergunta
Eu tenho usuários que são membros de grupos por meio de uma tabela de ingressos para associação, e um dos atributos dessa tabela de junção é "Administrador". Estou tentando fazer uma verificação dentro da visualização de um membro de um grupo, percorrendo cada membro para ver se eles são um administrador.
Na visão, tentei o seguinte:
for user in @group.users
if user.administrator?
...DO STUFF
end
end
Eu também tentei isso no controlador:
@administrators = @group.memberships.find(:all, :conditions => ["administrator = 1"])
Mas sem sorte. Alguma ideia?
Atualização - Per abaixo, coloque um método no modelo de usuário:
def is_administrator_of(group_id)
Membership.find(:first, :conditions => ['user_id = ? AND group_id = ? AND administrator = ?', self[:id], group_id, true])
end
Solução
Embora eu ache que você possa configurar associações para realizar isso, acho que a maneira mais fácil de fazer seria adicionar um método ao seu modelo de usuário que permite que você verifique cada usuário (dessa maneira ele caberia no loop que você forneceu). Não sei se isso vai cair certo, pode fazer algumas mudanças rápidas, mas você pode começar com algo como:
Modelo de usuário
def is_administrator_of(group_id)
Membership.find(:first, :conditions => ['user_id = ? AND group_id = ?', self[:id], group_id]).administrator == 1
end
Outras dicas
Eu acho que essa seria uma maneira mais limpa de fazer isso
class Group < ActiveRecord::Base
has_many :memberships
has_many :users, :through => :memberships
has_many :admins, :through => :memberships, :source => :user,
:conditions => ['memberships.administrator = ?', true]
end
Agora você tem uma lista de admins
for user in @group.admins
...DO STUFF
end