123456789_123456789_123456789_123456789_123456789_

Module: ActiveRecord::Timestamp

Relationships & Source Files
Namespace Children
Modules:
Extension / Inclusion / Inheritance Descendants
Included In:
Super Chains via Extension / Inclusion / Inheritance
Class Chain:
Defined in: activerecord/lib/active_record/timestamp.rb

Overview

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

Class Method Summary

::ActiveSupport::Concern - Extended

class_methods

Define class methods from given block.

included

Evaluate given block in context of base class, so that you can write class macros here.

prepended

Evaluate given block in context of base class, so that you can write class macros here.

append_features, prepend_features

Instance Attribute Summary

Instance Method Summary

DSL Calls

included

[ GitHub ]


46
47
48
# File 'activerecord/lib/active_record/timestamp.rb', line 46

included do
  class_attribute :record_timestamps, default: true
end

Instance Attribute Details

#should_record_timestamps?Boolean (readonly, private)

[ GitHub ]

  
# File 'activerecord/lib/active_record/timestamp.rb', line 141

def should_record_timestamps?
  record_timestamps && (!partial_updates? || has_changes_to_save?)
end

Instance Method Details

#_create_record (private)

[ GitHub ]

  
# File 'activerecord/lib/active_record/timestamp.rb', line 105

def _create_record
  if record_timestamps
    current_time = current_time_from_proper_timezone

    all_timestamp_attributes_in_model.each do |column|
      _write_attribute(column, current_time) unless _read_attribute(column)
    end
  end

  super
end

#_update_record (private)

[ GitHub ]

  
# File 'activerecord/lib/active_record/timestamp.rb', line 117

def _update_record
  record_update_timestamps

  super
end

#all_timestamp_attributes_in_model (private)

[ GitHub ]

  
# File 'activerecord/lib/active_record/timestamp.rb', line 153

def all_timestamp_attributes_in_model
  self.class.all_timestamp_attributes_in_model
end

#clear_timestamp_attributes (private)

Clear attributes and changed_attributes

[ GitHub ]

  
# File 'activerecord/lib/active_record/timestamp.rb', line 168

def clear_timestamp_attributes
  all_timestamp_attributes_in_model.each do |attribute_name|
    self[attribute_name] = nil
    clear_attribute_change(attribute_name)
  end
end

#create_or_update(touch: true) (private)

[ GitHub ]

  
# File 'activerecord/lib/active_record/timestamp.rb', line 123

def create_or_update(touch: true, **)
  @_touch_record = touch
  super
end

#current_time_from_proper_timezone (private)

[ GitHub ]

  
# File 'activerecord/lib/active_record/timestamp.rb', line 157

def current_time_from_proper_timezone
  self.class.current_time_from_proper_timezone
end

#init_internals (private)

[ GitHub ]

  
# File 'activerecord/lib/active_record/timestamp.rb', line 100

def init_internals
  super
  @_touch_record = nil
end

#initialize_dup(other)

This method is for internal use only.
[ GitHub ]

  
# File 'activerecord/lib/active_record/timestamp.rb', line 50

def initialize_dup(other) # :nodoc:
  super
  clear_timestamp_attributes
end

#max_updated_column_timestamp (private)

[ GitHub ]

  
# File 'activerecord/lib/active_record/timestamp.rb', line 161

def max_updated_column_timestamp
  timestamp_attributes_for_update_in_model
    .filter_map { |attr| self[attr]&.to_time }
    .max
end

#record_update_timestamps (private)

[ GitHub ]

  
# File 'activerecord/lib/active_record/timestamp.rb', line 128

def record_update_timestamps
  if @_touch_record && 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

  yield if block_given?
end

#timestamp_attributes_for_create_in_model (private)

[ GitHub ]

  
# File 'activerecord/lib/active_record/timestamp.rb', line 145

def timestamp_attributes_for_create_in_model
  self.class.timestamp_attributes_for_create_in_model
end

#timestamp_attributes_for_update_in_model (private)

[ GitHub ]

  
# File 'activerecord/lib/active_record/timestamp.rb', line 149

def timestamp_attributes_for_update_in_model
  self.class.timestamp_attributes_for_update_in_model
end