ActiveRecord-查找带有数组的行并使用值数组更新列?

时间:2018-09-25 21:58:39

标签: arrays activerecord sql-update

让我们说我有一些用户,我想更新他们的年龄,因为我一开始就把他们弄错了。我一次可以做一个:

User.find(20).update(age: 25)

但是我可以拉一个数组给用户,然后用另一个数组中的相应位置更新每个人吗?我在想像这样的东西:

User.find([20,46,78]).update_all(age: [25, 50, 43])

我有一个用户ID列表及其正确年龄应该是什么,因此我想为这些用户更改现有ID。最好的方法是什么?

1 个答案:

答案 0 :(得分:1)

一种方法,如果您的后备存储是MySql / Maria,则可以执行以下操作:

arr = { 1 => 22, 2 => 55}.map { |id, age| "(#{id}, #{age})" }
User.connection.execute("INSERT into users (id, age) VALUES #{arr.join(',')} ON DUPLICATE KEY UPDATE age = VALUES(age)")

这是假设您的表名是users。小心。由于SQL是手动编写的,因此请注意注入问题。根据您的需求,此解决方案可能对您不起作用。大多数情况下,它会绕过ActiveRecord,因此您将不会获得任何验证或回调。