我有一些项目。这些项目通过成员(member)资格拥有用户。
但是,这些用户属于公司。问题是,我如何找出哪些公司可以访问一个项目?
理想情况下,我可以做 project.users.companies,但这行不通。
有没有一种好的、愉快的方式来做到这一点?
最佳答案
其他答案似乎忽略了您提到的成员(member)资格。如果这些是您记录的实际对象,那么您选择做什么取决于您的表的大小。如果它们不是特别大,那么“更多面向对象”的解决方案可能看起来像这样:
class Project < ActiveRecord::Base
has_many :memberships
has_many :users, :through => :memberships
def user_companies
self.users.map {|user| user.companies}.flatten.uniq
end
end
class Membership < ActiveRecord::Base
belongs_to :user
belongs_to :project
end
class User < ActiveRecord::Base
has_many :memberships
has_many :projects, :through => :memberships
belongs_to :company
end
class Company < ActiveRecord::Base
has_many :users
end
这可能表现不佳,因为它从数据库中提取大量数据,然后在内存中进行所有过滤,但读取起来非常直观。如果你想把所有的计算都推到数据库中,我认为一个好的解决方案可能会在 Project 类中看起来像这样:
def user_companies
Company.find_by_sql("SELECT company.*
FROM companies, users, memberships
WHERE companies.id = users.company_id
AND users.id = memberships.user_id
AND memberships.project_id = #{self.id}")
end
它不太干净,但会将大部分处理放在最接近数据的位置,并且只有三表连接不应该最终生成如此大量的元组,以至于您的 DBMS 看起来分崩离析。
关于ruby-on-rails - Rails 中的深层关系,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/2405706/