假设我有一个模型:
class Result < ActiveRecord::Base
attr_accessible :x, :y, :sum
end
而不是做
Result.all.find_each do |s|
s.sum = compute_sum(s.x, s.y)
s.save
end
假设compute_sum
是一种可用的方法,并且执行一些无法转换为 SQL 的计算。
def compute_sum(x,y)
sum_table[x][y]
end
有没有办法使用update_all
,可能是这样的:
Result.all.update_all(sum: compute_sum(:x, :y))
我有超过 80,000 条记录需要更新。每条记录在find_each
创建自己的BEGIN
and COMMIT
查询,并且每条记录都会单独更新。
或者还有其他更快的方法吗?
如果compute_sum函数无法转换为sql,那么您就无法一次对所有记录执行update_all。您将需要迭代各个实例。但是,如果列中存在大量重复的值集,您可以通过对每组输入仅执行一次计算,然后每次计算执行一次批量更新来加快速度。例如
Result.all.group_by{|result| [result.x, result.y]}.each do |inputs, results|
sum = compute_sum(*inputs)
Result.update_all('sum = #{sum}', "id in (#{results.map(&:id).join(',')})")
end
您可以将 result.x、result.y 替换为compute_sum 函数的实际输入。
编辑 - 忘记在 group_by 块中将 result.x、result.y 放在方括号中。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)