我们有一个公司,公司用户,用户和评级模型定义如下:
公司模式
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
)?
答案 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
将传递具有预加载关联的模型。