Saludos,filtrado de objetos secundarios en un has_many: a través de la relación en Rails 3
Tengo una aplicación donde Companies
y Users
tienen que pertenecer el uno al otro a través de un modelo de CompanyMembership
, que contiene información adicional sobre el número de miembros (en concreto, si el Usuario es o no administrador de la empresa, a través de un valor booleano admin
). Una versión simple del código:
class CompanyMembership < ActiveRecord::Base
belongs_to :company
belongs_to :user
end
class Company < ActiveRecord::Base
has_many :company_memberships
has_many :users, :through => :company_memberships
end
class User < ActiveRecord::Base
has_many :company_memberships
has_many :companies, :through => :company_memberships
end
Por supuesto, esto hace que sea sencillo para obtener todos los miembros de una empresa a través de company.users.all
, et al. Sin embargo, estoy tratando de obtener una lista de todos los Usuarios de una Compañía que son administradores de esa Compañía (y también para probar si un usuario es un administrador de una compañía determinada). Mi primera solución fue la siguiente en company.rb
:
def admins
company_memberships.where(:admin => true).collect do |membership|
membership.user
end
end
def is_admin?(user)
admins.include? user
end
Aunque esto funciona, algo se siente ineficaz al respecto (se itera sobre cada miembro, ejecutar SQL cada vez, a la derecha O es la relación más inteligente que eso??), Y yo No estoy seguro de si hay una forma mejor de hacerlo (tal vez usando los ámbitos o los nuevos y lujosos objetos Relation
que utiliza Rails 3).
¡Cualquier consejo sobre la mejor manera de proceder (preferiblemente utilizando las mejores prácticas de Rails 3) sería muy apreciado!
¡Un paso más cerca! Si bien no es la respuesta que estaba buscando, me llevó a eso :) –