ruby-on-rails - ActiveRecord 触摸(:column) always also updates :updated_at

标签 ruby-on-rails activerecord

我遇到了和这个人差不多的问题:http://www.ruby-forum.com/topic/197440 .

我正在尝试触摸一列 (:touched_at) 而不让它自动更新 :updated_at,但是观察 SQL 查询,它总是更新到当前时间。

我认为这可能与我使用它的特定模型有关,所以我尝试了几个不同的模型,结果相同。

有谁知道是什么原因导致它在触摸不同的列时总是设置 :updated_attouch 在内部使用 write_attribute,所以它不应该这样做。

编辑:

一些澄清...... touch 的 Rails 2.3.5 文档声明“如果传递了属性名称,则该属性用于触摸而不是 updated_at/on 属性。”但我的不是这样。也许是文档偏离了代码的实际状态?

最佳答案

您非常想编写自定义 SQL:

def touch!
  self.class.update_all({:touched_at => Time.now.utc}, {:id => self.id})
end

这将生成以下 SQL:

UPDATE posts SET touched_at = '2010-01-01 00:00:00.0000' WHERE id = 1

这就是你所追求的。如果你调用#save,这最终会调用#create_with_timestamps。或 #update_with_timestamps ,这些是更新 updated_on/updated_at/created_on/created_at 列的内容。

顺便说一下,#touch 的来源说明一切。

关于ruby-on-rails - ActiveRecord 触摸(:column) always also updates :updated_at,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3774305/

相关文章:

mysql - 为什么 Rails 读取旧的数据库值?

ruby-on-rails - 如何更改来自 DigitalOcean 的 One Click App for Ruby on Rails 图像中的默认项目

ruby-on-rails - 如何在 AWS 的 80 端口上运行 Rails?

activerecord - 未定义的方法 `find_or_create'

mysql - 使 ActiveRecord/Rails 使用实际的 mysql TIMESTAMP 列

ruby-on-rails - 如何在routes.rb中添加别名

ios - Rails 4.2 - 将图像数据作为电子邮件附件发送而不保存图像

sql - Rails - 传递给 #or 的关系必须在结构上兼容。不兼容的值 : [:joins]

ruby-on-rails - ActiveRecord 添加负日期年份

ruby-on-rails - 如何在连接表中按条件接收对象