Rails 4 update_all 并从另一个字段设置值

Rails 4 update_all and set value from another field

我需要在某些模型中进行一些批量更新,并将一个字段的值设置为另一个字段的值。

现在我可以像这样用原始 sql 做到这一点:

ActiveRecord::Base.connection.execute("UPDATE `deleted_contents` SET `deleted_contents`.`original_id` = `deleted_contents`.`id` WHERE `deleted_contents`.`original_id` is NULL")

这工作正常,但由于多种原因,我需要使用 ActiveRecord 查询接口来执行此操作。 我试过了:

DeletedContent.where(original_id: nil).update_all(original_id: value_of_id_column)

对于 value_of_id_column 我尝试了 :id、self.id、id 等,但没有任何效果。我应该为 value_of_id_column 设置什么以获取由 rails 生成的原始查询?这是可能的,还是使用原始 sql 是唯一的解决方案?

我也不想遍历每条记录并更新。这对我来说不是一个有效的解决方案:

DeletedContent.where(original_id: nil).each do |deleted_content|
    update_each_record
end

我很确定您无法通过将哈希传递给 update_all 来获得该查询。

最接近您想要获得的是:

DeletedContent.where(original_id: nil).update_all("original_id = id")