如何在迁移中快速修改列的所有值?

时间:2015-03-09 22:39:16

标签: ruby-on-rails activerecord

我有一个带有数字列的Message表。我想添加" ++"到数字列中每个字符串的开头。我不认为我可以使用update_all,因为每行的每个值都不同。我尝试使用Message.find_each,修改当前值以使" ++"在前面然后保存,但它需要永远迁移(100万+行)。

有更快的方法吗?

3 个答案:

答案 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`)")

它应该非常快