Rails created_at是由Ruby还是SQL填充的?

时间:2016-02-17 09:00:36

标签: ruby-on-rails activerecord

Rails如何分配created_at?从理论上讲,它可以在Ruby层或SQL层完成。

我问这个是因为我希望它在SQL层完成。这有助于确定几个记录中的一些竞争条件。如果它来自SQL层,我可以相信这些标记表示它实际上在数据库中最终可供其他人查看的时间。

1 个答案:

答案 0 :(得分:3)

已在ActiveRecord Timestamp模块中完成,此处:

https://github.com/rails/rails/blob/master/activerecord/lib/active_record/timestamp.rb

def _create_record
  if self.record_timestamps
    current_time = current_time_from_proper_timezone

    all_timestamp_attributes.each do |column|
      column = column.to_s
      if has_attribute?(column) && !attribute_present?(column)
        write_attribute(column, current_time)
      end
    end
  end

  super
end

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|
      column = column.to_s
      next if attribute_changed?(column)
      write_attribute(column, current_time)
    end
  end
  super(*args)
end