Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Is there a way to avoid automatically updating Rails timestamp fields?

If you have DB columns created_at and updated_at Rails will automatically set those values when you create and update a model object. Is there a way to save the model without touching those columns?

I am bringing in some legacy data and I would like to set those values from the corresponding values in the (differently named) legacy data fields. I'm finding when I set them on the model and then save the model, Rails appears to override the incoming values.

Of course I could just name the Rails model columns differently to prevent that, but after the data is imported, I want Rails to do its automatic timestamp thing.

like image 466
Ethan Avatar asked May 14 '09 03:05

Ethan


3 Answers

Do this in a migration or in a rake task (or in the new database seeds if you're on edge rails):

ActiveRecord::Base.record_timestamps = false
begin
  run_the_code_that_imports_the_data
ensure
  ActiveRecord::Base.record_timestamps = true  # don't forget to enable it again!
end

You can safely set created_at and updated_at manually, Rails won't complain.

Note: This also works on individual models, e.g. User.record_timestamps = false

like image 174
August Lilleaas Avatar answered Sep 21 '22 15:09

August Lilleaas


use update_column method instead:

http://api.rubyonrails.org/classes/ActiveRecord/Persistence.html#method-i-update_column

update_column(name, value)
# Updates a single attribute of an object, without calling save.

Validation is skipped.

Callbacks are skipped.

updated_at/updated_on column is not updated if that column is available.

Raises an ActiveRecordError when called on new objects, or when the name attribute is marked as readonly.

like image 33
yawl Avatar answered Sep 20 '22 15:09

yawl


Rails 5 provides a convenient way to update a record without updating it's timestamp updated_at: https://api.rubyonrails.org/classes/ActiveRecord/Persistence.html#method-i-save

You, just need to pass touch:false while updating your record.

>> user = User.first
>> user.updated_at
=> Thu, 28 Apr 2016 20:01:57 IST +05:30
>> user.name = "Jose"
>> user.save(touch: false)
=> true

>> user.updated_at
=> Thu, 28 Apr 2016 20:01:57 IST +05:30
like image 38
Subhash Chandra Avatar answered Sep 18 '22 15:09

Subhash Chandra