Active Model Serializer将所有日期转换为秒

时间:2017-02-15 20:44:12

标签: ruby-on-rails ruby active-model-serializers

我需要将我的api返回的所有日期转换为Unix日期格式(秒)。个别很容易......

class ChimichangaSerializer < ActiveModel::Serializer
  attributes :updated_at,

  def updated_at
    object.updated_at.to_i
  end
end

但是因为我必须为所有事情做到这一点,这种方式就是错误和疯狂。如何为所有这些功能实现此功能?

2 个答案:

答案 0 :(得分:1)

添加以下内容:

app/config/initializers/time_with_zone.rb

class ActiveSupport::TimeWithZone
  def as_json(options = {})
    to_i
  end
end

这将覆盖转换为json时所有时间戳的默认行为。

答案 1 :(得分:1)

在看到关于输入转换的评论后,如果您不以任何其他形式使用它们,我认为您可以覆盖这些字段的getter和setter方法。也许这些方面的东西会有所帮助。

值得注意的是,这不仅会影响字段的序列化。如果你想保持这些领域的正常行为,我会选择Tadman的建议。

# with_unix_time.rb
module WithUnixTime
  # These methods lack error handling
  def to_unix_time(*fields)
    fields.each do |field|

      # Override getter.
      define_method field do
        self[field].to_i
      end

      # Override setter
      define_method "#{field}=" do |value|
        self[field] = Time.at(value)
      end

      # Convenience method to retrieve the original DateTime type
      define_method "raw_#{field}" do
        self[field]
      end
    end
  end
end

# chimichanga.rb
class Chimichanga < ActiveRecord::Base
  extend WithUnixTime
  to_unix_time :time_to_kill, :time_for_joke
end