我正在运行rails 3.0。我有一个对象,我想更改一个布尔字段,但不想更改updated_at时间戳。我们不会很快升级rails,所以update_column是不可能的。我宁愿不进行模型级更改来支持这一点(比如在这篇文章中:http://blog.bigbinary.com/2009/01/21/override-automatic-timestamp-in-activerecord-rails.html),因为这种类型的许多对象可能同时有调用它们的方法。
答案 0 :(得分:7)
您可以使用.update_all:
User.where(:id => @user.id).update_all(:your_bool_field => true)
答案 1 :(得分: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
答案 2 :(得分:4)
Rails 5允许在不更新时间戳的情况下更新记录。
在Rails 4.x中,当我们保存ActiveRecord对象时,Rails会自动更新字段updated_at
或updated_on
在ActiveRecord::Base#save
中添加了触摸选项。
在Rails 5中,通过传递touch: false
作为保存选项,我们可以在不更新时间戳的情况下更新对象。 touch
的默认选项为true
。
>> 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