ActiveRecord:find_in_batches的替代方案?

big*_*ato 9 activerecord ruby-on-rails

我有一个查询加载数以千计的对象,我想通过使用find_in_batches以下来驯服它:

Car.includes(:member).where(:engine => "123").find_in_batches(batch_size: 500) ...

根据文档,我不能有自定义排序顺序:http://www.rubydoc.info/docs/rails/4.0.0/ActiveRecord/Batches: find_in_batches

但是,我需要一个自定义排序顺序created_at DESC.是否有另一种方法可以像在find_in_batches中那样以块的形式运行此查询,这样就不会在堆上同时存在这么多对象?

big*_*ato 2

嗯,我一直在考虑这个问题的解决方案(我是问这个问题的人)。这是有道理的,find_in_batches不允许你有自定义顺序,因为假设你排序created_at DESC并指定batch_size为500。第一个循环从1-500,第二个循环从501-1000,等等。如果之前怎么办发生第二个循环,有人向表中插入一条新记录?它将被放在查询结果的顶部,并且您的结果将向左移动 1,并且您的第二个循环将重复。

您可能会说虽然这样created_at ASC是安全的,但如果您的应用程序指定了created_at 值,则不能保证。

更新:

我为这个问题写了一个 gem:https ://github.com/EdmundMai/batched_query

自从使用它以来,我的应用程序的平均内存减少了一半。我强烈建议有类似问题的人检查一下!如果你愿意的话,也可以贡献一份力量!