我有一个我需要运行的复杂查询,它可能会产生一个大的结果集。我需要在这个结果集中线性迭代,以便处理一些数字。
我正在执行这样的查询:
ActiveRecord::Base.connection.select_all(query)
find_in_batches对我的用例不起作用,因为以自定义顺序获取记录至关重要。此外,我的查询返回一些不属于任何模型的字段,因此我需要将记录作为哈希值。
问题是,select_all
并不是懒惰的(据我所知)。它将所有记录加载到内存中。 Rails是否有办法懒洋洋地获取自定义SQL查询的结果? .lazy
似乎不适用于此,因为我需要对结果进行自定义排序。
这在其他语言(C#,Haskell,JavaScript)中是可行的,所以看起来它在Ruby中是可能的。
答案 0 :(得分:0)
您可以尝试find_each
或find_in_batches
ActiveRecord方法。
两个查询数据库都是可配置大小的批次。
find_each
逐个产生对象阻塞(它们是惰性初始化)的区别。
find_in_batches
产生整批组。
如果由于自定义排序而无法使用上述方法,您可以使用limit
和offset
查询数据库。这样您就可以分批处理数据。内存消耗将减少,但查询数量将增加。
其他解决方案可能是让数据库引擎执行您需要的算术运算并返回计算结果。
答案 1 :(得分:0)
不确定,但也许你要求eager_load或preload。 http://blog.arkency.com/2013/12/rails4-preloading/
希望这可以帮到你。