【问题标题】:Active Model Serializer transform all dates to secondsActive Model Serializer 将所有日期转换为秒
【发布时间】:2017-02-15 20:44:12
【问题描述】:

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

class ChimichangaSerializer < ActiveModel::Serializer
  attributes :updated_at,

  def updated_at
    object.updated_at.to_i
  end
end

但由于我必须为所有事情都做这件事,这样就会产生错误和疯狂。我怎样才能为所有这些实现这个功能?

【问题讨论】:

  • 这是针对所有updated_at 字段还是针对一堆其他不相关的字段?
  • 所有包含日期​​的字段。目前,我在几种不同的型号上有 5 个。作为奖励,输入相反。目前,我正在手动转换每一个。
  • 您可以继承 ActiveModel::Serializer 并引入您自己的 attributes 方法,该方法采用 :as_integer 之类的选项。

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


【解决方案1】:

添加以下内容:

app/config/initializers/time_with_zone.rb

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

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

【讨论】:

  • 真的好用,省心了
【解决方案2】:

在看到您关于输入转换的评论后,我认为如果您不以任何其他形式使用它们,您可以覆盖这些字段的 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

【讨论】:

  • 只是为了让您知道,这样您就不会觉得自己挂了,我将尝试一下,看看效果如何,但因为它目前的功能是'不要扩展,直到我一周左右的下一个截止日期之后,所以我不会立即选择最佳答案。
  • @TiggerToo 完全没问题
猜你喜欢
  • 2019-12-24
  • 1970-01-01
  • 2012-12-09
  • 2010-10-08
  • 2013-10-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多