3

我正在运行rails 3.0。我有一个对象,我想更改一个布尔字段,但不想更改 updated_at 时间戳。我们不会很快升级 rails,所以 update_column 是不可能的。我宁愿不进行模型级别的更改来支持这一点(例如在这篇文章中:http: //blog.bigbinary.com/2009/01/21/override-automatic-timestamp-in-activerecord-rails.html),因为许多这种类型的对象可能同时调用它们的方法。

4

3 回答 3

7

您可以在更新之前将 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

于 2012-08-01T19:23:40.830 回答
7

您可以使用 .update_all:

User.where(:id => @user.id).update_all(:your_bool_field => true)
于 2012-08-01T19:25:37.280 回答
7

Rails 5 允许在不更新时间戳的情况下更新记录。

在 Rails 4.x 中,当我们保存 ActiveRecord 对象时,Rails 会自动更新字段updated_atupdated_on

中添加触摸选项ActiveRecord::Base#save

在 Rails 5 中,通过touch: false作为保存选项传递,我们可以在不更新时间戳的情况下更新对象。的默认选项touchtrue

>> user = User.new(name: 'David', email: 'david@example.com')
>> 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", "john@example.com"]]
=> 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
于 2016-05-12T16:59:12.393 回答