【问题标题】:How to process a large ActiveRecord result set in groups如何分组处理大型 ActiveRecord 结果集
【发布时间】:2026-01-10 04:10:02
【问题描述】:

我想知道是否有办法获取一组 ActiveRecord 结果(或任何数组,就此而言)并以 25 个左右为一组进行处理。像这样的:

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

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

【问题讨论】:

    标签: ruby-on-rails ruby arrays activerecord


    【解决方案1】:

    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

    【讨论】:

    • 我最初选择了你的答案,但最终选择了 Matt Rogish 的答案,因为它避免了多次查询。
    • 我敦促您重新考虑 Bloudermilk。如果您有很多记录,则不仅要花费 很多 时间来获取它们,而且还会占用大量内存,这可能会使您的服务器无响应。小批量处理它们比一次获取它们要好得多。
    【解决方案2】:

    【讨论】:

    • 这将获取整个集合并将其全部存储在内存中。坏主意。
    • 取决于行数和大小。在查询/网络效率和 ruby​​ 进程的内存使用之间存在权衡。只有最初的提问者知道哪些适用于他们的问题
    • 瑞恩是对的。 AR::Base#find_eachAR::Base#find_in_batches 是解决方案。
    • 如果你 find(:all) 处理一个 1000 万行的表,它将把它全部存储在内存中。使用 in_groups_of 只会加剧这个问题。