Ruby on rails ActiveRecord touch(:column)也始终更新:在

Ruby on rails ActiveRecord touch(:column)也始终更新:在,ruby-on-rails,activerecord,Ruby On Rails,Activerecord,我的问题和这家伙差不多 我试图触摸一个列(:toucted_at),而不让它自动更新:updated_at,但在查看SQL查询时,它总是将两个列都更新到当前时间 我认为这可能与我使用的特定型号有关,所以我尝试了两种不同的型号,结果相同 有人知道是什么原因导致它在触摸其他列时总是设置:updated_attouch在内部使用write\u属性,因此不应该这样做 编辑: 一些澄清。。。用于触摸的Rails 2.3.5文档声明“如果传递了属性名,则该属性将用于触摸,而不是更新的_at/on属性。”但我

我的问题和这家伙差不多

我试图触摸一个列(
:toucted_at
),而不让它自动更新
:updated_at
,但在查看SQL查询时,它总是将两个列都更新到当前时间

我认为这可能与我使用的特定型号有关,所以我尝试了两种不同的型号,结果相同

有人知道是什么原因导致它在触摸其他列时总是设置
:updated_at
touch
在内部使用
write\u属性,因此不应该这样做

编辑:


一些澄清。。。用于触摸的Rails 2.3.5文档声明“如果传递了属性名,则该属性将用于触摸,而不是更新的_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,则最终将调用or,这就是更新更新的_on/updated_at/created_on/created_at列的内容


顺便说一句,信息来源说明了一切。

这似乎是唯一的办法。看起来Rails 2.3.5文档是错误的。我想补充一点,我可以把
触摸方法,用于完成ActiveRecord功能的复制
属于
:touch=>:column
(我认为在保存
之前使用
,在销毁
之前使用
,但我必须检查源代码)。
全部更新({:touch=>Time.now.utc},{:id=>self.id})
已被弃用,取而代之的是
self.class.where(id:self.id).update\u all(toucted\u at:Time.now.utc)