编写"has_many :through"的最佳方法是什么,以便它只使用普通的 WHERE 查询,而不是内部连接?



>我有一个用户模型。所有用户都属于一个公司,公司有许多记录:

class User < ApplicationRecord
belongs_to :company
end
class Company < ApplicationRecord
has_many :records
end
class Record < ApplicationRecord
belongs_to :company
end

我正在使用 Devise 对用户进行身份验证,因此我想从current_user开始所有查询,以确保我只返回允许用户查看的记录。我只想称呼这样的东西:

current_user.company_records

(我不想打电话给current_user.company.records,因为我不需要加载公司。我只需要记录。

如果我这样做:

has_many :company_records, source: :records, through: :company

然后 Rails 做一个内部连接,这是粗略的:

2.3.3 :030 > user.company_records
Record Load (0.5ms)  SELECT "records".* FROM "records" INNER JOIN "companies" ON 
"records"."company_id" = "companies"."id" WHERE "companies"."id" = $1  [["id", 1]]

我必须这样做:

has_many :company_records,
class_name: 'Record',
primary_key: :company_id,
foreign_key: :company_id

然后 Rails 将只运行一个简单的"where"查询(它有正确的索引):

2.3.3 :039 > user.company_records
Record Load (0.4ms)  SELECT "records".* FROM "records" WHERE "records"."company_id" = $1  [["company_id", 1]]

有没有更好的写法?我可以做:

def company_records
Record.where(company_id: company_id)
end

。但我想知道是否有一种更惯用的方法可以使用 ActiveRecord 关联来做到这一点。

最好使用委托?

delegate :records, to: :company, prefix: true

然后你可以直接使用

current_user.company_records

最新更新