has_one与链接的关联包括

时间:2015-02-13 12:09:36

标签: ruby-on-rails ruby-on-rails-4

我们有一个公司,公司用户,用户和评级模型定义如下:

公司模式

class Company < ActiveRecord::Base
  has_many :company_users
  has_many :users, through: :company_users


  has_one :company_owner, where(is_owner: true), class_name: 'CompanyUser', foreign_key: :user_id
  has_one :owner, through: :company_owner
end

is_owner表中有一个company_users标志,用于标识公司所有者。

公司用户模型

class CompanyUser < ActiveRecord::Base
  belongs_to :company
  belongs_to :user

  belongs_to :owner, class_name: 'User', foreign_key: :user_id
end

用户模型

class User < ActiveRecord::Base
  has_many :company_users
  has_many :companies, through: :company_users

  has_many :ratings
end

评分模型

class Rating
  belongs_to :user
  belongs_to :job
end

我可以通过以下代码找到公司的所有者:

@owner = @company.owner

我需要获得所有者的评级和工作以及所有者。我可以这样做

@owner = @company.owner
@ratings = @owner.ratings.includes(:job)

但是我们已经在视图中的许多位置使用了@owner.ratings,并且很难更改视图中的所有引用,因为它是跨越几个部分的相当大的视图。我尝试了以下内容以与所有者一起获得评级

@owner = @company.owner.includes(:ratings => :job)

但是这给了我错误,因为@company.owner似乎给了一个User对象,它似乎不支持链接。

我有没有办法在ratings对象中获得包含的关联(job@owner)?

1 个答案:

答案 0 :(得分:3)

你应该可以这样做:

@owner = Company.where(id: @company.id).includes(owner: {ratings: :job}).owner

然而,这不是很干净。更好的是实际更改@company变量:

@company = Company.includes(owner: {ratings: :job}).find(params[:company_id])  # or params id or any other call you're currently using to get the company.

以这种方式构建的公司已经包含了所有内容,因此:

@owner = @company.owner

将传递具有预加载关联的模型。