我想知道是否有方法接收ActiveRecord结果数组(或任何数组),并以25个左右的组进行处理。这样的事情:如何处理组中的大型ActiveRecord结果集
User.all.each(25) do |group|
# Some code that works with this group of 25
end
我只是想避免做多个连续的数据库查询。谢谢!
我想知道是否有方法接收ActiveRecord结果数组(或任何数组),并以25个左右的组进行处理。这样的事情:如何处理组中的大型ActiveRecord结果集
User.all.each(25) do |group|
# Some code that works with this group of 25
end
我只是想避免做多个连续的数据库查询。谢谢!
的Rails 2.3有这个功能。您可以指定batch_size
参数。
User.find_in_batches(:batch_size =>25) do |group|
# Some code that works with this group of 25
end
你可以找到一个很好的教程here。请注意,Rails将为每25条记录发出查询。如果您正在处理大量记录,这有助于保持较低的内存。如果您想将结果拆分为多个数组,则可以使用Matt提出的in_groups_of
。
你可能寻找
Array#in_groups_of
http://weblog.rubyonrails.org/2006/3/1/new-in-rails-enumerable-group_by-and-array-in_groups_of
这将获取整个集合并将其全部存储在内存中。馊主意。 – 2009-12-31 04:07:56
取决于多少行和多大。在查询/网络效率和ruby进程的内存使用之间有一个折衷。只有原始提问者有知识才能说出适用于他们的问题 – 2009-12-31 04:21:28
Ryan是对的。 AR :: Base#find_each或AR :: Base#find_in_batches是解决方案。 – 2009-12-31 17:13:55
我最初选择了你的答案,但是因为它避免了多次查询而与Matt Rogish结束了。 – bloudermilk 2009-12-31 04:09:06
我建议你重新考虑Bloudermilk。如果你有很多记录,它不仅需要很多时间来获取它们,还会占用大量内存,这可能会使服务器无法响应。小批量处理它们比一次抓取它们要好得多。 – 2010-01-02 01:13:21