使用#update_all更新时间戳

问题描述 投票:17回答:4

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

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

执行此更新后,updated_at字段不变。但是,当我使用rails c进入rails console并执行此操作时:

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
4个回答
37
投票

[#update_all does not instantiate models

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

编辑有关编辑的内容:

如果要保留“一个查询来全部统治”,则可以更新updated_at以及:closed

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

但是请注意,验证仍然没有运行。


1
投票

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

同样,它不会触发回调或验证-并且时间戳将在回调中进行。update_at是对参考http://api.rubyonrails.org/classes/ActiveRecord/Relation.html#method-i-update_all的回调


0
投票

时间戳

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

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


0
投票

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

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

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

© www.soinside.com 2019 - 2024. All rights reserved.