gpt4 book ai didi

ruby-on-rails - update_all 方法

转载 作者:数据小太阳 更新时间:2023-10-29 07:47:42 26 4
gpt4 key购买 nike

假设我有一个模型:

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 中的每条记录都创建自己的BEGINCOMMIT 查询,并且每条记录都单独更新。

或者还有其他更快的方法吗?

最佳答案

如果无法将 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 block 中将 result.x、result.y 放在方括号中。

关于ruby-on-rails - update_all 方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33231610/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com