Укажите только необходимые ключи JSON в качестве атрибутов ActiveModel::Serializers.

При анализе JSON API с использованием ActiveModel::Serializers есть ли способ не указывать каждый отдельный ключ в JSON в качестве атрибутов?

Скажем, мне нужно только :first_name, :last_name, :country для моих представлений - если я также не укажу другие ключи в JSON, :street_address, :postal_code, :phone, :email, я получу неопределенный метод 'street_address=' для #.

Я нашел http://bigastronaut.com/blog/2014/don-t-serialize-just-a-few-give-me-all-attributes, но его PR еще не принят: https://github.com/rails-api/active_model_serializers/pull/535 -- есть ли что-то еще, что я мог бы сделать за это время?

class GetFromJson
  include ActiveModel::Serializers::JSON

  attr_accessor :first_name, :last_name, :country # :street_address, :postal_code, :phone, :email

  def attributes=(hash)
    hash.each do |key, value|
      send("#{key}=", value)
    end
  end

  def self.fetch

    # Code to fetch JSON from API

  end
end

person Mark Boulder    schedule 03.08.2014    source источник


Ответы (1)


Я думаю, что всегда лучше прямо определять, что вы хотите в своем сериализаторе, но я понимаю вашу точку зрения, что в определенных обстоятельствах это может раздражать... одна вещь, которую вы могли бы сделать, это определить все attr_accessors для каждого имени столбца в модели. , если сериализатор должен сериализовать конкретную модель ActiveRecord.

Скажем, например, у вас есть модель AR с именем Person, вы можете найти все атрибуты базы данных объекта, просто написав Person.column_names, это не даст вам виртуальные атрибуты, которые вы можете захотеть, но, по крайней мере, «дает вам все атрибуты базы данных по умолчанию». '

Так что это будет что-то вроде:

class PersonSerializer < ActiveModel::Serializer
  Person.column_names.each {|pcn| attributes pcn}

  #...define other virtual attributes here, etc.
end
person derekyau    schedule 03.08.2014
comment
Выглядит здорово, но что делать, если эти атрибуты исходят из одного ответа JSON? Мой пример использования здесь: gist.github.com/frankie-loves-jesus/e9dc286ec79834f96c7b< /а> - person Mark Boulder; 04.08.2014
comment
Также я только что наткнулся на bigastronaut .com/blog/2014/ и, следовательно, github.com/rails-api /active_model_serializers/pull/535 -- Я считаю, что было бы лучше, если бы и когда это было принято? - person Mark Boulder; 04.08.2014
comment
Кажется, вы получаете данные от стороннего API, а затем анализируете их в методе fetch, возможно, вы могли бы просто установить атрибуты из метода keys возвращаемого хэша? - person derekyau; 04.08.2014