2017-02-15 10 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 и представить свой собственный метод 'attributes', который принимает такие параметры, как': as_integer' или что-то в этом роде. – tadman

ответ

1

После просмотра вашего комментария относительно преобразования ввода, я думаю, вы можете переопределить методы получения и настройки для этих полей, если вы не используете их в какой-либо другой форме. Возможно, что-то вроде этого поможет.

Важно отметить, что это повлияет не только на сериализацию поля. Если вы хотите сохранить нормальное поведение для этих полей, я бы посоветовал Тадману.

# 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

Просто, чтобы вы знали, так что вы не чувствуете, что висели, я собираюсь попробовать это и посмотреть, как это происходит, но так как в настоящее время он функционирует так, чтобы он не масштабировался, т. е. до моего следующего срока в неделю или около того, поэтому я не буду сразу выбирать наилучший ответ. – TiggerToo

+0

@TiggerToo не проблема вообще –

0

Добавьте следующее:

app/config/initializers/time_with_zone.rb

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

это будет переопределять поведение по умолчанию для всех меток времени при преобразовании в JSON.

 Смежные вопросы

  • Нет связанных вопросов^_^