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