module ActiveRecord::Timestamp

Active Record Timestamp

Active Record automatically timestamps create and update operations if the table has fields named created_at/created_on or updated_at/updated_on.

Timestamping can be turned off by setting:

config.active_record.record_timestamps = false

Timestamps are in UTC by default but you can use the local timezone by setting:

config.active_record.default_timezone = :local

Time Zone aware attributes

Active Record keeps all the datetime and time columns timezone aware. By default, these values are stored in the database as UTC and converted back to the current Time.zone when pulled from the database.

This feature can be turned off completely by setting:

config.active_record.time_zone_aware_attributes = false

You can also specify that only datetime columns should be time-zone aware (while time should not) by setting:

ActiveRecord::Base.time_zone_aware_types = [:datetime]

You can also add database specific timezone aware types. For example, for PostgreSQL:

ActiveRecord::Base.time_zone_aware_types += [:tsrange, :tstzrange]

Finally, you can indicate specific attributes of a model for which time zone conversion should not applied, for instance by setting:

class Topic < ActiveRecord::Base
  self.skip_time_zone_conversion_for_attributes = [:written_on]
end

Public Instance Methods

all_timestamp_attributes_in_model() click to toggle source
# File activerecord/lib/active_record/timestamp.rb, line 65
def all_timestamp_attributes_in_model
  timestamp_attributes_for_create_in_model + timestamp_attributes_for_update_in_model
end
current_time_from_proper_timezone() click to toggle source
# File activerecord/lib/active_record/timestamp.rb, line 77
def current_time_from_proper_timezone
  default_timezone == :utc ? Time.now.utc : Time.now
end
timestamp_attributes_for_create() click to toggle source
# File activerecord/lib/active_record/timestamp.rb, line 69
def timestamp_attributes_for_create
  ["created_at", "created_on"]
end
timestamp_attributes_for_create_in_model() click to toggle source
# File activerecord/lib/active_record/timestamp.rb, line 57
def timestamp_attributes_for_create_in_model
  timestamp_attributes_for_create.select { |c| column_names.include?(c) }
end
timestamp_attributes_for_update() click to toggle source
# File activerecord/lib/active_record/timestamp.rb, line 73
def timestamp_attributes_for_update
  ["updated_at", "updated_on"]
end
timestamp_attributes_for_update_in_model() click to toggle source
# File activerecord/lib/active_record/timestamp.rb, line 61
def timestamp_attributes_for_update_in_model
  timestamp_attributes_for_update.select { |c| column_names.include?(c) }
end

Private Instance Methods

_create_record() click to toggle source
Calls superclass method
# File activerecord/lib/active_record/timestamp.rb, line 84
def _create_record
  if record_timestamps
    current_time = current_time_from_proper_timezone

    all_timestamp_attributes_in_model.each do |column|
      if !attribute_present?(column)
        _write_attribute(column, current_time)
      end
    end
  end

  super
end
_update_record(*args, touch: true, **options) click to toggle source
Calls superclass method
# File activerecord/lib/active_record/timestamp.rb, line 98
def _update_record(*args, touch: true, **options)
  if touch && should_record_timestamps?
    current_time = current_time_from_proper_timezone

    timestamp_attributes_for_update_in_model.each do |column|
      next if will_save_change_to_attribute?(column)
      _write_attribute(column, current_time)
    end
  end
  super(*args)
end
clear_timestamp_attributes() click to toggle source

Clear attributes and changed_attributes

# File activerecord/lib/active_record/timestamp.rb, line 139
def clear_timestamp_attributes
  all_timestamp_attributes_in_model.each do |attribute_name|
    self[attribute_name] = nil
    clear_attribute_changes([attribute_name])
  end
end
max_updated_column_timestamp(timestamp_names = timestamp_attributes_for_update_in_model) click to toggle source
# File activerecord/lib/active_record/timestamp.rb, line 130
def max_updated_column_timestamp(timestamp_names = timestamp_attributes_for_update_in_model)
  timestamp_names
    .map { |attr| self[attr] }
    .compact
    .map(&:to_time)
    .max
end
should_record_timestamps?() click to toggle source
# File activerecord/lib/active_record/timestamp.rb, line 110
def should_record_timestamps?
  record_timestamps && (!partial_writes? || has_changes_to_save?)
end