2012-08-01 88 views
3

我正在運行rails 3.0。我有一個對象,我想更改布爾字段但不想更改updated_at時間戳。我們不會很快升級rails,所以update_column是不可能的。我寧願不進行模型級別的更改來支持此操作(如在此帖子中:http://blog.bigbinary.com/2009/01/21/override-automatic-timestamp-in-activerecord-rails.html),因爲此類型的許多對象可能同時具有對它們調用的方法。更新屬性而不更改updated_at字段

+3

你總是可以運行一些原始的SQL,不是嗎? – 2012-08-01 19:20:41

+0

[有沒有辦法避免自動更新Rails時間戳字段?](http://stackoverflow.com/questions/861448/is-there-a-way-to-avoid-automatically-updating-rails-timestamp -fields) – 2016-05-12 18:45:34

回答

7

你可以使用.update_all:

User.where(:id => @user.id).update_all(:your_bool_field => true) 
+0

這工作,謝謝! – 2012-08-01 19:50:18

+4

請注意,這不會觸發回調 – mahemoff 2013-01-21 04:33:55

6

更新前可以將record_timestamps屬性設置爲false。

User.record_timestamps=false 
User.first.update_attributes(:field1 => "Test") 
User.record_timestamps=true 

更多: http://blog.bigbinary.com/2009/01/21/override-automatic-timestamp-in-activerecord-rails.html

+0

沒錯,我在我的原始問題中發佈了一篇到那篇博文的鏈接。我正在尋找其他方法來做到這一點,不涉及改變類的屬性。 – 2012-08-01 19:47:34

+2

非線程安全 – mpoisot 2013-03-25 21:43:39

+0

這是非常危險的,當您的update_attributes正在運行時,任何更新的用戶都不會被加時間戳。對於單個用戶而言,對於可輕易破解的併發用戶來說這不是問題。 – Batou99 2015-10-13 14:53:45

3

Rails的5允許更新記錄而不更新時間戳。

在Rails 4.x中,當我們保存一個ActiveRecord對象,然後Rails的自動更新字段ActiveRecord::Base#saveupdated_atupdated_on

加觸摸選項。

在Rails 5中,通過傳遞touch: false作爲保存選項,我們可以在不更新時間戳的情況下更新對象。 touch的默認選項是true

>> user = User.new(name: 'David', email: '[email protected]') 
>> user.save 
    INSERT INTO "users" ("name", "created_at", "updated_at", "email") VALUES (?, ?, ?, ?) 
    [["name", "John"], ["created_at", 2016-05-12 05:10:22 UTC], ["updated_at", 2016-05-12 05:10:22 UTC], ["email", "[email protected]"]] 
=> true 

>> user.updated_at 
=> Thu, 12 May 2016 05:10:22 UTC +00:00 
>> user.name = "John" 
>> user.save(touch: false) 
    UPDATE "users" SET "name" = ? WHERE "users"."id" = ? [["name", "John"], ["id", 12]] 
=> true 

>> user.updated_at 
=> Thu, 12 May 2016 05:10:22 UTC +00:00