【问题标题】:Update multiple records in one query in ruby on rails在 ruby​​ on rails 的一个查询中更新多条记录
【发布时间】:2021-11-26 20:52:29
【问题描述】:

假设我有一个这样的哈希数组

users_ar = [
 {
   id: 1,
   name: 'Luke',
   age: 19
 },
 {
   id: 2,
   name: 'Vader',
   age: 44
 },
 {
   id: 3,
   name: 'Yoda',
   age: 129
 }
]

id 是他们在 User 模型中的 id。

如果我有数千条记录要更新,出于性能原因,如何在 ruby​​ on rails 中一次更新所有记录(如果我不需要验证记录)?

我想按 id 查找现有记录并更新姓名和年龄。我正在寻找这样的东西:

users_to_update.update_all(users_ar)

我的 rails 版本是 5.2.3,我使用的是 MySQL。

谢谢,安德烈亚斯

【问题讨论】:

  • 你将“更新”什么?名字?年龄?也许甚至是身份证?还是您的意思是INSERT 3 个新行而不是UPDATE 3 个现有行?或者,也许是“upsert”,您可以添加新行或根据某个唯一键(大概是id)修改现有行。
  • 那个“哈希数组”是关闭了id吗?还是name
  • 我已经更新了我的问题。我喜欢按 id 查找记录并更新姓名和年龄。

标签: mysql ruby-on-rails ruby activerecord rails-activerecord


【解决方案1】:

在 MySQL 中:

INSERT INTO tbl
    (id, name, age)
      VALUES
    (1, 'Luke', 19),
    (2, 'Vader', 44),
    (3, 'Yoda', 129)
    ON DUPLICATE KEY UPDATE
        name = VALUES(name),
        age = VALUES(age);
    

虽然这看起来像一个“更新插入”,但它是我所知道的一次更新多行的最快方法。在您的情况下,所有行都已经存在(根据唯一的id),因此它继续更新每一行。

(不,我不知道如何在 RoR 中说这个。bugged 提供的链接可能会回答这个问题。)

【讨论】:

    【解决方案2】:

    activerecord-import gem 可能是您想要进行具有良好性能的大批量更新时所需要的:https://github.com/zdennis/activerecord-import

    【讨论】:

    • 不应该该链接说 matched 而不是 violated 它说“......它允许您指定应该更新其值的字段如果主键或唯一键约束违反"??
    猜你喜欢
    • 2017-01-03
    • 2023-03-28
    • 1970-01-01
    • 1970-01-01
    • 2013-12-13
    • 1970-01-01
    • 2017-06-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多