我们有一个公司、公司用户、用户和评级模型,定义如下:
公司模型
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
对象中包含的关联(ratings
和job
)?
您应该能够使用:
@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
将传递带有预加载关联的模型。