Acceso a valores en un has_many: unirse a través de la mesa
-
20-09-2019 - |
Pregunta
He conseguido los usuarios que son miembros de grupos a través de una tabla de unión de miembros, y uno de los atributos de esa tabla de unión es "administrador". Estoy tratando de hacer una verificación en el interior de vista del miembro de un grupo, de enlace a través de cada miembro para ver si son un administrador.
En la vista He intentado lo siguiente:
for user in @group.users
if user.administrator?
...DO STUFF
end
end
I también intentado esto en el controlador:
@administrators = @group.memberships.find(:all, :conditions => ["administrator = 1"])
Pero no hubo suerte. ¿Alguna idea?
actualización - por debajo, poner un método en el modelo de usuario:
def is_administrator_of(group_id)
Membership.find(:first, :conditions => ['user_id = ? AND group_id = ? AND administrator = ?', self[:id], group_id, true])
end
Solución
A pesar de que creo que se podría asociaciones de configuración de lograr esto creo que la forma más fácil de hacerlo sería añadir un método a su modelo de usuario que le permite comprobar para cada usuario (esta manera que encajaría en el bucle que tiene previsto). No sé si va a caer bien, puede tardar unos cambios rápidos pero se puede comenzar con algo como:
Modelo de usuarios
def is_administrator_of(group_id)
Membership.find(:first, :conditions => ['user_id = ? AND group_id = ?', self[:id], group_id]).administrator == 1
end
Otros consejos
Creo que esta sería una forma más limpia de hacer esto
class Group < ActiveRecord::Base
has_many :memberships
has_many :users, :through => :memberships
has_many :admins, :through => :memberships, :source => :user,
:conditions => ['memberships.administrator = ?', true]
end
Ahora tiene una lista group.admins
for user in @group.admins
...DO STUFF
end