Muszę konwertować wszystkie daty, które zwracają się przez mój interfejs API do formatu daty UNIX (sekundy). Indywidualnie jest wystarczająco łatwy ...

class ChimichangaSerializer < ActiveModel::Serializer
  attributes :updated_at,

  def updated_at
    object.updated_at.to_i
  end
end

Ale ponieważ muszę to zrobić za wszystko, w ten sposób leży błędy i szaleństwo. Jak mogę osiągnąć tę funkcjonalność dla wszystkich?

2
TiggerToo 15 luty 2017, 23:44

2 odpowiedzi

Najlepsza odpowiedź

Po zobaczeniu komentarza dotyczącego konwersji wejściowej, myślę, że można zastąpić metody Gettera i Setter dla tych pól, jeśli nie używasz ich w żadnej innej formie. Może pomogłaby coś wzdłuż tych linii.

Ważne jest, aby pamiętać, że wpłynie to nie tylko na serializację pola. Jeśli chcesz zachować normalne zachowanie dla tych dziedzin, pójdę z doradcą Tadmana.

# 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
1
Alexandre Angelim 16 luty 2017, 02:48

Dodaj następujące informacje:

app/config/initializers/time_with_zone.rb

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

Spowoduje to przesłanie domyślnego zachowania dla wszystkich swoich znaczników czasu po przeliczeniu na JSON.

2
coorasse 15 luty 2017, 21:13