【问题标题】:Updating timestamps with #update_all使用 #update_all 更新时间戳
【发布时间】:2020-03-05 20:50:24
【问题描述】:

当我有想要更新其属性的 ID 列表时,数据库中的 updated_at 字段似乎没有改变,这就是我的意思:

ids = [2,4,51,124,33]
MyObj.where(:id => ids).update_all(:closed => true)

执行此更新后,updated_at 字段不会更改。但是,当我使用 rails c 进入 rails 控制台并执行此操作时:

obj = MyObj.find(2)
obj.closed = false;
obj.save!

在此语句之后updated_at 字段更改值。为什么是这样?我在我的应用程序中依赖这个 updated_at 字段,因为我正在收听更新并在发生这种情况时执行整个应用程序流程?

编辑

我刚刚从dax 得知答案:

Timestamps

Note that ActiveRecord will not update the timestamp fields (updated_at/updated_on) when using update_all().

我不想一次更新一条记录,有没有办法解决这个问题?不诉诸sql级别?

【问题讨论】:

    标签: ruby-on-rails ruby ruby-on-rails-3


    【解决方案1】:

    #update_alldoes not instantiate models.

    因此,它不会触发回调或验证 - 并且时间戳更新是在回调中进行的。

    关于编辑的编辑:

    如果您想保留“一个查询来统治所有这些”,您可以更新 updated_at 以及 :closed

    MyObj.where(:id => ids).update_all(closed: true, updated_at: DateTime.now)
    

    但请注意验证仍未运行。

    【讨论】:

    • +1 表示“一个查询来统治所有这些” - 这是一个更好的答案:)
    • 感谢奥利维尔的回答。我也想过这个我只是希望有更优雅的解决方案。谢谢,我现在就去。
    • 我认为Time.now在这种情况下更合适
    • 不要使用 DateTime.now,使用 DateTime.current,它将使用应用程序的默认时区,默认为 UTC+00。 DateTime.now 使用系统的时区。
    • @blushrt 在这种情况下没关系。如今,Active Record 足够聪明,可以在类似这样的查询中将 Time.now 转换为 DB 时区。在其他情况下(尤其是当您处理日期而不是时间时)您确实需要注意时区。
    【解决方案2】:

    全部更新,此方法构造单个 SQL UPDATE 语句并将其直接发送到数据库。它不会实例化涉及的模型,也不会触发 Active Record 回调或验证。传递给 update_all 的值不会通过 ActiveRecord 的类型转换行为。它应该只接收可以按原样传递给 SQL 数据库的值。

    因此,它不会触发回调或验证 - 并且时间戳更新是在回调中进行的。update_at 是一个回调以供参考 http://api.rubyonrails.org/classes/ActiveRecord/Relation.html#method-i-update_all

    【讨论】:

      【解决方案3】:

      时间戳

      请注意,ActiveRecord 在使用 update_all() 时不会更新时间戳字段(updated_at/updated_on)。

      来源:http://apidock.com/rails/ActiveRecord/Relation/update_all

      【讨论】:

      • 有办法解决这个问题吗?
      • 基本上只需创建您自己的 update 列,然后将其与您要更新的其他内容一起更新
      • 如果我理解正确的话,Gandalf 想要触摸 updated_at,而不是避免触摸它。我说得对吗,甘道夫?
      【解决方案4】:

      如果有人感兴趣,我确实做了一个要点,概述了如何自己滚动它。

      https://gist.github.com/timm-oh/9b702a15f61a5dd20d5814b607dc411d

      这是一个超级简单的实现,只是为了完成工作。 如果您觉得还有改进的余地,请评论要点:)

      【讨论】:

        猜你喜欢
        • 2023-02-03
        • 1970-01-01
        • 2014-03-25
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-11-19
        • 1970-01-01
        相关资源
        最近更新 更多