2010-09-22 73 views
3

我和这个人有几乎相同的问题:http://www.ruby-forum.com/topic/197440ActiveRecord touch(:列)总是也会更新:updated_at

我试图触摸一列(:touched_at)而没有自动更新:updated_at,但看着SQL查询,它总是更新到当前时间。

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

有谁知道什么可能导致它总是设置:updated_at时触摸不同的列? touch内部使用write_attribute,所以它不应该这样做。

编辑:

一些澄清...了Rails 2.3.5文档的touch状态,“如果一个属性名被传递,该属性用于触摸代替的updated_at /上属性。 “但我的行为并非如此。也许这是一个文档偏离代码的实际状态的情况?

回答

8

你几乎要编写自定义的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的来源说这一切。

+0

这似乎是唯一的方法。看起来Rails 2.3.5文档是错误的。我想添加回答,我可以在模型的回调中加入'touch!'方法来完成对ActiveRecord'belongs_to''s':touch =>:column'的功能的复制(我认为它使用'before_save '和'before_destroy',但我必须检查源代码)。 – tfe 2010-09-23 18:50:36

+0

'.update_all({:touched_at => Time.now.utc},{:id => self.id})'已被弃用,以支持'self.class.where(id:self.id).update_all touched_at:Time.now.utc)' – astephenb 2014-11-19 21:34:44

相关问题