Filtrage des objets enfants dans un has_many :la relation d'aide dans Rails 3

Salutations,

J'ai une application dans laquelle Companies et Users besoin d'appartenir à chacun des autres par le biais d'un CompanyMembership modèle, qui contient des informations supplémentaires au sujet de la composition (en particulier, si oui ou non l'Utilisateur est un administrateur de la société, par l'intermédiaire d'une valeur booléenne admin). Une simple version du code:

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

Bien sûr, cela rend plus simple pour obtenir tous les membres d'une société par l'intermédiaire de company.users.all, et al. Cependant, je suis en train d'essayer d'obtenir une liste de tous les Utilisateurs en Entreprise qui sont administrateurs de la Société (et aussi pour vérifier si un utilisateur est un administrateur d'une société donnée). Ma première solution était la suivante 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

Alors que cela fonctionne, quelque chose se sent inefficace à ce sujet (c'est une itération sur chaque adhésion, de l'exécution de SQL à chaque fois, non? Ou est Relativement plus intelligent que ça?), et je ne suis pas sûr si il ya une meilleure façon d'aller à ce sujet (peut-être à l'aide de l'étendue ou la nouvelle fantaisie Relation objets Rails 3 utilise?).

Des conseils sur la meilleure façon de procéder (de préférence à l'aide de Rails 3, meilleures pratiques) serait grandement apprécié!

OriginalL'auteur Michelle Tilley | 2010-09-20