假设我有一些用户,我想更新他们的年龄,因为我一开始把他们放错了。我可以一次做一个,因为:
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,因此您不会获得任何验证或回调。