2009-12-31 48 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