Rails中有一个懒惰的select_all选项吗?

时间:2016-11-03 14:32:01

标签: ruby-on-rails ruby activerecord

我有一个我需要运行的复杂查询,它可能会产生一个大的结果集。我需要在这个结果集中线性迭代,以便处理一些数字。

我正在执行这样的查询:

ActiveRecord::Base.connection.select_all(query)

find_in_batches对我的用例不起作用,因为以自定义顺序获取记录至关重要。此外,我的查询返回一些不属于任何模型的字段,因此我需要将记录作为哈希值。

问题是,select_all并不是懒惰的(据我所知)。它将所有记录加载到内存中。 Rails是否有办法懒洋洋地获取自定义SQL查询的结果? .lazy似乎不适用于此,因为我需要对结果进行自定义排序。

这在其他语言(C#,Haskell,JavaScript)中是可行的,所以看起来它在Ruby中是可能的。

2 个答案:

答案 0 :(得分:0)

您可以尝试find_eachfind_in_batches ActiveRecord方法。

两个查询数据库都是可配置大小的批次。

find_each逐个产生对象阻塞(它们是惰性初始化)的区别。

find_in_batches产生整批组。

如果由于自定义排序而无法使用上述方法,您可以使用limitoffset查询数据库。这样您就可以分批处理数据。内存消耗将减少,但查询数量将增加。

其他解决方案可能是让数据库引擎执行您需要的算术运算并返回计算结果。

答案 1 :(得分:0)

不确定,但也许你要求eager_load或preload。 http://blog.arkency.com/2013/12/rails4-preloading/

希望这可以帮到你。