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文档是错误的。我想补充一点,我可以把触摸模型回调中的code>方法,用于完成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)