首页 > 解决方案 > 在 Rails 中批量更新 ActiveRecord 对象

问题描述

我有大约 60,000 条记录要更新。我遇到的问题是迭代它们的迁移需要很长时间才能运行。我正在考虑批量更新,但不太确定在实践中会是什么样子。

这是我目前拥有的:

Report.find_each(:batch_size => 100) do |rp|
  next if rp.job.blank? || (rp.booked_amount.blank? && rp.approved_estimate.blank?)
  new_declined_est = (rp.booked_amount || 0) - (rp.approved_estimate || 0)
  rp.update_columns(
      booked_amount: rp.job.booked_estimate_amount,
      approved_estimate: rp.job.grand_total,
      declined_estimate: new_declined_est
  )
end

^ 这是作为迁移运行的当前任务。这需要很长时间,很长时间。我试过这个 re: bulk upserts (但我是新手):

Report.find_each(:batch_size => 100) do |rp|
  next if rp.job.blank? || (rp.booked_amount.blank? && rp.approved_estimate.blank?)
  new_declined_est = (rp.booked_amount || 0) - (rp.approved_estimate || 0)
  puts rp
  rp.upsert_all([
                      { booked_amount: rp.job.booked_estimate_amount,
                        approved_estimate: rp.job.grand_total,
                        declined_estimate: new_declined_est },
                  ], unique_by: :id)
end

显然,我在这里做错了什么。谁能指出我正确的方向?

标签: ruby-on-railsactiverecordbulkinsertbulkupdate

解决方案


推荐阅读