2010-09-22 70 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

相關問題