Rails 5 Updating a record without updating timestamps

Abhishek Jain

Abhishek Jain

May 9, 2016

This blog is part of our  Rails 5 series.

In Rails 4.x, when we save an ActiveRecord object then Rails automatically updates fields updated_at or updated_on.

1
2>> user = User.new(name: 'John', email: '[email protected]')
3>> user.save
4 INSERT INTO "users" ("name", "created_at", "updated_at", "email") VALUES (?, ?, ?, ?)  [["name", "John"], ["created_at", 2016-03-16 09:12:44 UTC], ["updated_at", 2016-03-16 09:12:44 UTC], ["email", "[email protected]"]]
5=> true
6
7>> user.updated_at
8=> Wed, 16 Mar 2016 09:12:44 UTC +00:00
9
10>> user.name = "Mark"
11>> user.save
12  UPDATE "users" SET "name" = ?, "updated_at" = ? WHERE "users"."id" = ?  [["name", "Mark"], ["updated_at", 2016-03-16 09:15:30 UTC], ["id", 12]]
13=> true
14
15>> user.updated_at
16=> Wed, 16 Mar 2016 09:15:30 UTC +00:00
17

Addition of touch option in ActiveRecord::Base#save

In Rails 5, by passing touch: false as an option to save, we can update the object without updating timestamps. The default option for touch is true.

1
2>> user.updated_at
3=> Wed, 16 Mar 2016 09:15:30 UTC +00:00
4
5>> user.name = "Dan"
6>> user.save(touch: false)
7  UPDATE "users" SET "name" = ? WHERE "users"."id" = ?  [["name", "Dan"], ["id", 12]]
8=> true
9
10>> user.updated_at
11=> Wed, 16 Mar 2016 09:15:30 UTC +00:00
12

This works only when we are updating a record and does not work when a record is created.

1
2>> user = User.new(name: 'Tom', email: '[email protected]')
3>> user.save(touch: false)
4 INSERT INTO "users" ("name", "created_at", "updated_at", "email") VALUES (?, ?, ?, ?)  [["name", "Tom"], ["created_at", 2016-03-21 06:57:23 UTC], ["updated_at", 2016-03-21 06:57:23 UTC], ["email", "[email protected]"]])
5
6>> user.updated_at
7=> Mon, 21 Mar 2016 07:04:04 UTC +00:00
8

If this blog was helpful, check out our full blog archive.

Stay up to date with our blogs.

Subscribe to receive email notifications for new blog posts.