Rails: всегда включать миллисекунды с created_at для каждой модели

Как мне изменить приложение Rails, чтобы всегда включать информацию о миллисекундах в поле created_at моих моделей?

Этот вопрос имеет ответ на вопрос, как это сделать для отдельной модели, но я хочу сделать это глобально.


Например, когда я извлекаю все мои модели Item (нажав /items с помощью GET), я получаю следующий JSON:

[{"created_at":"2011-08-07T23:42:15Z","updated_at":"2011-08-07T23:42:15Z","id":180,"user_id":6,"content":"test"}]

Но обратите внимание, что в поле created_at нет информации о миллисекунде, которую он создал. Как включить это для всех моих моделей?

Ответ 1

Мне удалось переопределить селектор атрибутов created_at для модели Item, используя это руководство.

Кто-нибудь знает, как это сделать для всех моделей?

Ответ 2

Для Rails 4.1 и выше вы можете установить time_precision, например. в application.rb

ActiveSupport::JSON::Encoding.time_precision = 3

Кстати, показ миллисекунд теперь по умолчанию, его можно установить на 0, если они должны быть опущены. Также хорошо знать, что .iso8601 не включает миллисекунды, но .as_json сохраняет их.

Ответ 3

Переопределение ActiveSupport::TimeWithZone#as_json работало для меня:

class ActiveSupport::TimeWithZone

  def as_json(options = nil)
    if ActiveSupport::JSON::Encoding.use_standard_json_time_format
      xmlschema(3)
    else
      %(#{time.strftime("%Y/%m/%d %H:%M:%S")} #{formatted_offset(false)})
    end
  end

end

Обязательно поместите этот код в файл, который требуется вашему Rails-приложению. Теперь, когда я конвертирую атрибут created_at в JSON, я получаю миллисекунды:

puts Post.last.created_at.to_json
# => "2012-06-29T11:51:00.841Z"

Также не забудьте использовать Time.zone для создания новых объектов Time, чтобы они отображали одно и то же поведение JSON:

time = Time.zone.now
puts time.to_json
# => "2012-06-29T16:45:30.547Z"

Надеюсь, это поможет кому-то!