Ответ 1
Мне удалось переопределить селектор атрибутов created_at
для модели Item, используя это руководство.
Кто-нибудь знает, как это сделать для всех моделей?
Как мне изменить приложение 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
нет информации о миллисекунде, которую он создал. Как включить это для всех моих моделей?
Мне удалось переопределить селектор атрибутов created_at
для модели Item, используя это руководство.
Кто-нибудь знает, как это сделать для всех моделей?
Для Rails 4.1 и выше вы можете установить time_precision, например. в application.rb
ActiveSupport::JSON::Encoding.time_precision = 3
Кстати, показ миллисекунд теперь по умолчанию, его можно установить на 0, если они должны быть опущены.
Также хорошо знать, что .iso8601
не включает миллисекунды, но .as_json
сохраняет их.
Переопределение 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"
Надеюсь, это поможет кому-то!