arrays - ActiveRecord - 使用数组查找行并使用值数组更新列?
问题描述
假设我有一些用户,我想更新他们的年龄,因为我一开始就把他们弄错了。我可以一次做一个:
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,因此您不会得到任何验证或回调。
推荐阅读
- html - Bootstrap 导航栏切换按钮无响应
- pip - 如何在 conda 环境文件中指定 pip find-links 选项?
- python - 如何使用 pybind11 在 C++ 线程中调用 Python 函数作为回调
- asp.net - ASP.NET MVC过滤器中filterContext.RequestContext.HttpContext和filterContext.HttpContext之间的区别`?
- r - 尝试在具有不同 k 和子集 R studio 的循环中执行 KNN 时出错
- python - 从mp3到特色:聚类音乐
- javascript - 我想知道如何在 Node.JS 中处理 POST 请求
- mysql - 无线与有线连接到 MySQL
- php - 为什么数组响应没有使用 PHP MySQL API 进入 JSON
- sql - 以天:小时:分钟:秒格式计算时差