我有一个带有数字列的Message表。我想添加" ++"到数字列中每个字符串的开头。我不认为我可以使用update_all,因为每行的每个值都不同。我尝试使用Message.find_each,修改当前值以使" ++"在前面然后保存,但它需要永远迁移(100万+行)。
有更快的方法吗?
答案 0 :(得分:1)
我会尝试这个。也许它足够快?
Message.find_in_batches.each do |batch|
batch.each do |msg|
msg.update_column :number, "++#{msg.number}"
end
end
这样可以防止单独加载每条记录,而是批量加载(默认为500条)?然后更新列将避免挂钩后的任何Rails。如果您想将此记录为更新,您可能希望将:updated_at
设置为Time.now
,这也是我一直忘记的事情。
或者。某些number
值是否相同?也许您可以按具有相同值的行进行分组,并对这些行进行update_all
?
答案 1 :(得分:1)
如果真的必须这样做,你想批量处理结果并进行迭代。为什么你必须在前面加上“++”?它可能会阻止您递增,您可以始终创建一个辅助方法,为该值添加前缀。
答案 2 :(得分:1)
使用简单的原始mysql怎么样?
ActiveRecord::Base.connection.excute("UPDATE messages set `number` = CONCAT('++', `number`)")
它应该非常快