gpt4 book ai didi

ruby-on-rails - 使用 `update_all` 时运行验证

转载 作者:行者123 更新时间:2023-12-03 23:35:10 26 4
gpt4 key购买 nike

根据 Rails 文档 herehere , 使用 update_all不执行以下操作 -

  • 它跳过验证
  • 它不会更新 updated_at字段
  • 它默默地忽略 :limit:order方法

  • 我正在尝试检查我的代码库并删除 update_all 的实例,特别是因为第一点。

    有没有办法仍然拥有 update_all的便利?并且仍然运行验证?我知道我可以遍历每条记录并保存它,但这不仅在视觉上更困惑而且效率更低,因为它执行 N 个 SQL 语句而不是 1 个
    # before
    User.where(status: "active").update_all(status: "inactive")
    # after
    User.where(status: "active").each { |u| u.update(status: "inactive") }

    谢谢!

    编辑:我正在使用 Rails 4.2

    最佳答案

    不幸的是 update_all更快,因为它不会为每条记录实例化一个事件记录对象,而是直接处理数据库。在您的情况下,由于您需要验证和回调,因此您需要实例化对象,因此您最好分批迭代 1000 个并按照最初显示的方式执行更新。如:

    User.where(status: "active").find_each { |u| u.update(status: "inactive") }
    find_each方法一次只加载 1000 个对象,因此不会使垃圾收集器过载。如果您在数十万行中有批量记录,我会考虑返回 update_all 或将更新移至后台任务,因为部署时很容易导致超时。

    关于ruby-on-rails - 使用 `update_all` 时运行验证,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39644646/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com