我有一些项目。这些项目通过成员(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/

10-10 08:41