Ruby on rails 什么';It’写“a”的最好方法是什么;有很多:通过;所以它只使用一个普通的WHERE查询,而不是一个内部连接?

Ruby on rails 什么';It’写“a”的最好方法是什么;有很多:通过;所以它只使用一个普通的WHERE查询,而不是一个内部连接?,ruby-on-rails,activerecord,associations,has-many-through,Ruby On Rails,Activerecord,Associations,Has Many Through,我有一个用户模型。所有用户都属于一个公司,公司有许多记录: class User < ApplicationRecord belongs_to :company end class Company < ApplicationRecord has_many :records end class Record < ApplicationRecord belongs_to :company end (我不想调用当前用户.company.records,因为我不需要加

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

class User < ApplicationRecord
  belongs_to :company
end

class Company < ApplicationRecord
  has_many :records
end

class Record < ApplicationRecord
  belongs_to :company
end
(我不想调用
当前用户.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”查询(具有适当的索引):

有没有更好的写作方法?我可以这样做:

def company_records
  Record.where(company_id: company_id)
end

。。。但我想知道是否有一种更惯用的方法来处理ActiveRecord关联。

最好使用委托

delegate :records, to: :company, prefix: true
然后你可以直接使用

current_user.company_records

感谢您的回答,但是
代表也将在加载任何记录之前加载公司。这是我试图避免的不必要的疑问。
delegate :records, to: :company, prefix: true
current_user.company_records