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
Vous devez vous connecter pour publier un commentaire.
Je crois que je vais sur ce de la mauvaise façon, en précisant les conditions sur
company_memberships
au lieu deusers
, qui était ce que je voulais (une liste deUsers
, pas une liste deCompanyMemberships
). La solution je pense que je cherchais:qui génère le SQL (pour l'entreprise avec l'ID de 1):
Je ne sais pas encore si je vais en avoir besoin, mais le
includes()
méthode va effectuer désireux de chargement pour limiter le nombre de requêtes SQL si nécessaire:(Je suis toujours ouvert à toutes les suggestions de tous ceux qui pensent que ce n'est pas le meilleur/le plus efficace/le droit chemin à parcourir à ce sujet.)
OriginalL'auteur Michelle Tilley
Encore le moyen le plus propre serait d'ajouter une association à votre modèle d'Entreprise, à quelque chose comme ceci:
Vous pourriez avoir à creuser dans la rails de doc pour obtenir la syntaxe exacte droit.
Vous ne devriez pas avoir besoin :comprendre, sauf si vous avez d'autres classes associées avec :utilisateur que vous pourriez référence de votre point de vue.
:conditions
une option valable pourhas_many
? Il n'apparaît pas dans la documentation.OriginalL'auteur Ed Haywood
Comment quelque chose comme cela:
OriginalL'auteur Ed Haywood