【发布时间】:2011-04-14 19:04:55
【问题描述】:
您好,
我有一个应用程序,其中 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 等获取公司的所有成员变得简单。但是,我正在尝试获取公司中作为该公司管理员的所有用户的列表(并且还测试用户是否是给定公司的管理员)。我的第一个解决方案是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 最佳实践)!
【问题讨论】:
标签: activerecord ruby-on-rails-3 has-many-through