问候,
我有一个应用程序需要通过模型相互归属,该Companies
模型包含有关成员资格的额外信息(特别是,用户是否是公司的管理员,通过布尔值)。代码的简单版本:Users
CompanyMembership
admin
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
当然,这使得通过company.users.all
, et al 获取公司的所有成员变得简单。但是,我正在尝试获取公司中作为该公司管理员的所有用户的列表(并且还测试用户是否是给定公司的管理员)。我的第一个解决方案如下company.rb
:
def admins
company_memberships.where(:admin => true).collect do |membership|
membership.user
end
end
def is_admin?(user)
admins.include? user
end
虽然这可行,但感觉效率低下(它迭代每个成员,每次都执行 SQL,对吗?或者 Relation 比这更聪明?),我不确定是否有更好的方法来解决这个问题(也许使用范围或 Rails 3 使用的花哨的新Relation
对象?)。
任何关于最佳方式的建议(最好使用 Rails 3 最佳实践)将不胜感激!