Ruby on rails 为集合缓存相关的ActiveRecord对象

Ruby on rails 为集合缓存相关的ActiveRecord对象,ruby-on-rails,activerecord,ruby-on-rails-4,Ruby On Rails,Activerecord,Ruby On Rails 4,我想选择一组ActiveRecord对象,它们的属于相关对象,只需完成一次查询。即在打电话之后 products = Product.joins(:image).limit(10) 在迭代products时,我希望product.image不会导致对数据库的另一个查询,但是它的image属性已经填充了从以前的查询中缓存的image实例 如何为select构造参数,以便它选择填充相关对象所需的所有属性?或者我看的方向不对,有其他方法可以减少每次迭代中不必要的查询: Image Load (1.0

我想选择一组ActiveRecord对象,它们的
属于
相关对象,只需完成一次查询。即在打电话之后

products = Product.joins(:image).limit(10)
在迭代
products
时,我希望
product.image
不会导致对数据库的另一个查询,但是它的
image
属性已经填充了从以前的查询中缓存的
image
实例

如何为
select
构造参数,以便它选择填充相关对象所需的所有属性?或者我看的方向不对,有其他方法可以减少每次迭代中不必要的查询:

Image Load (1.0ms)  SELECT "images".* FROM "images" WHERE "images"."id" = 270783 LIMIT 1
Image Load (1.2ms)  SELECT "images".* FROM "images" WHERE "images"."id" = 121344 LIMIT 1
Image Load (1.2ms)  SELECT "images".* FROM "images" WHERE "images"."id" = 196239 LIMIT 1
Image Load (1.2ms)  SELECT "images".* FROM "images" WHERE "images"."id" = 91194 LIMIT 1 
Image Load (1.2ms)  SELECT "images".* FROM "images" WHERE "images"."id" = 116278 LIMIT 1
Image Load (1.2ms)  SELECT "images".* FROM "images" WHERE "images"."id" = 117207 LIMIT 1
Image Load (0.8ms)  SELECT "images".* FROM "images" WHERE "images"."id" = 244471 LIMIT 1
Image Load (0.8ms)  SELECT "images".* FROM "images" WHERE "images"."id" = 239287 LIMIT 1
Image Load (0.8ms)  SELECT "images".* FROM "images" WHERE "images"."id" = 15124 LIMIT 1 
Image Load (1.2ms)  SELECT "images".* FROM "images" WHERE "images"."id" = 186670 LIMIT 1
你想要的是所谓的“急切加载”。您所要做的就是将
.joins(:image)
更改为
.includes(:image)
以获得快速加载

products = Product.includes(:image).limit(10)

另请参见。

完美!正是我需要的。几乎可以,因为我认为可以用一个查询而不是两个查询来完成,但这并不重要。