优化 Rails 急切加载查询以查找所有

Posted

技术标签:

【中文标题】优化 Rails 急切加载查询以查找所有【英文标题】:Optimize Rails eager loading query for find all 【发布时间】:2009-12-25 10:03:43 【问题描述】:

在 Rails 2.3.5 应用程序中,我有以下模型:

class Foo < ActiveRecord::Base
  has_many :bars
end

class Bar < ActiveRecord::Base
  belongs_to :foo
end

当我打电话时

Foo.all(:include => :bars)

我在控制台中看到以下查询:

 SELECT * FROM "foos"
 SELECT "bars".* FROM "bars" WHERE ("bars".foo_id IN (1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21))

在 where 子句中包含所有 foo 的 id。

我想这不是一个最佳查询,而 id 的数量可能很大,我需要预加载所有的“条”。另外,实际上我没有两个模型,而是一个链。

有没有办法让急切加载查询像

SELECT "bars".* FROM "bars" 

什么时候使用 find all?

【问题讨论】:

【参考方案1】:

这其实是一种优化,实际上Rails会在id的数量变多时改变查询策略。

您也可以使用:join 而不是:include

【讨论】:

也可以在这里查看akitaonrails.com/2008/5/26/…“优化的急切加载”部分 谢谢,knoopx!我想到,急切的加载必须不知道我是否实际上加载了所有表行,或者所有 foo 都匹配某些条件(因此,WHERE 子句将不包括所有 foo 的 id。)我现在正在尝试查找如果出于好奇而 id 的数量变高,Rails 会更改查询策略。哎呀,也感谢您的链接!

以上是关于优化 Rails 急切加载查询以查找所有的主要内容,如果未能解决你的问题,请参考以下文章

使用 Rails 查询急切加载

实施急切加载以停止 N+1 - Rails

急切加载与加入获取相同吗?

如何使用急切加载来查询尽可能少的数据?

Rails 急切加载所有发现

如何在 laravel 中检索用户时急切加载?