2009-12-31 37 views
4

我想知道是否有方法接收ActiveRecord结果数组(或任何数组),并以25个左右的组进行处理。这样的事情:如何处理组中的大型ActiveRecord结果集

User.all.each(25) do |group| 
    # Some code that works with this group of 25 
end 

我只是想避免做多个连续的数据库查询。谢谢!

回答

21

的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

+0

我最初选择了你的答案,但是因为它避免了多次查询而与Matt Rogish结束了。 – bloudermilk 2009-12-31 04:09:06

+1

我建议你重新考虑Bloudermilk。如果你有很多记录,它不仅需要很多时间来获取它们,还会占用大量内存,这可能会使服务器无法响应。小批量处理它们比一次抓取它们要好得多。 – 2010-01-02 01:13:21

-2
+5

这将获取整个集合并将其全部存储在内存中。馊主意。 – 2009-12-31 04:07:56

+1

取决于多少行和多大。在查询/网络效率和ruby进程的内存使用之间有一个折衷。只有原始提问者有知识才能说出适用于他们的问题 – 2009-12-31 04:21:28

+3

Ryan是对的。 AR :: Base#find_each或AR :: Base#find_in_batches是解决方案。 – 2009-12-31 17:13:55