has_one与链接include关联



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

公司模型

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

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

公司用户模型

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对象,而且它似乎不支持链接。

有没有一种方法可以获取@owner对象中包含的关联(ratingsjob)?

您应该能够使用:

@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

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