首页 > 解决方案 > ActiveRecord - 使用数组查找行并使用值数组更新列?

问题描述

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

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

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

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

我有一个用户 ID 列表以及他们的正确年龄应该是多少,所以我想为这些用户更改现有的。最好的方法是什么?

标签: arraysactiverecordsql-update

解决方案


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


推荐阅读