Rails:对于每个模型,始终包含created_at的毫秒数

如何修改我的Rails应用程序以始终包含我的模型的created_at字段的毫秒信息?

这个问题有关于如何为单个模型做到这一点的答案,但我想在全球范围内进行。


例如,当我检索所有的Item模型时(通过使用GET命中/items ),我得到以下JSON:

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

但请注意, created_at字段没有关于它创建的毫秒数的任何信息。 如何为我的所有模型添加该function?

对于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" 

希望这有助于某人!

我可以使用本指南覆盖我的Item模型的created_at属性选择器。

任何人都知道如何为所有型号做到这一点?