我想知道是否有方法接收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