活动记录 - 查找带有数组的行并使用值数组更新列?



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

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

但是我是否可以使用数组拉取用户,然后使用另一个数组中的相应位置更新每个人?我正在想象这样的事情:

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

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

一种方法是,如果你的后备存储是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,因此您不会获得任何验证或回调。

最新更新