ruby-on-rails - 在 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
显然,我在这里做错了什么。谁能指出我正确的方向?
解决方案
推荐阅读
- flutter - firebase登录后如何自动重定向?
- sql - 使用窗口函数引用前一行值
- java - 为什么我的 androidx.test 导入在调试构建变体中不起作用?
- swift - 网络调用语法 Xcode 的编译器错误
- jmeter - 通过 CLI 运行 Jmeter 脚本时出错
- python - 如何获取 ManyToMany 字段中的值的计数
- symfony - 打印表单嵌套错误 Symfony 5
- javascript - javascript timer 每次重置和重新运行时都会将时间值加倍
- docker - Centos 7 安装特定版本的docker ce
- c++ - 无法在 C/C++ Visual Studio 中使用宽字符串,即使它可以在使用 MinGW 的 CodeBlocks 中使用