2017-02-15 20 views
1

私のAPIによって返されるすべての日付をUnixの日付形式(秒)に変換する必要があります。個別には十分です...アクティブモデルシリアライザはすべての日付を秒に変換します

class ChimichangaSerializer < ActiveModel::Serializer 
    attributes :updated_at, 

    def updated_at 
    object.updated_at.to_i 
    end 
end 

私はすべてのためにそれをしなければならないので、その方法はエラーと狂気です。これらの機能をすべてどのように実現できますか?

+0

これは、すべての 'updated_at'フィールドまたはそうでなければ無関係なフィールドの束ですか? – tadman

+0

日付が入っているすべてのフィールド。現在、私はいくつかの異なるモデルで5を持っています。 ボーナスとして、同じことを逆に入力します。現在、私は手動でそれぞれのものを変換しています。 – TiggerToo

+0

ActiveModel :: Serializerをサブクラス化し、 ':as_integer'などのオプションを取る独自の' attributes'メソッドを導入することができます。 – tadman

答えて

1

入力変換についてのコメントも見てから、他の形式で使用していない場合は、これらのフィールドのゲッターとセッターメソッドをオーバーライドできると思います。多分これらの行に沿った何かが助けになるでしょう。

これは、フィールドのシリアル化だけでなく、それらのフィールドの正常な動作を維持したい場合は、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 
+0

ちょうどあなたが知っているので、あなたがぶらぶられているように感じることはありません、私はこれを試して、それがどのように行くのか見るつもりです、しかし、それは現在スケールされていない方法で機能しているので、次の締め切りまで1週間ほどかかりますので、すぐに最良の回答を選ぶことはありません。 – TiggerToo

+0

@TiggerToo全く問題ありません –

0

は、以下を追加します。

app/config/initializers/time_with_zone.rb

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

JSONに変換したときに、これはすべてのあなたのタイムスタンプのデフォルトの動作をオーバーライドします。

関連する問題