>我有一个用户模型。所有用户都属于一个公司,公司有许多记录:
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