ActiveModel :: Serializer :: JSON - Как отобразить массив JSON из возвращенной строки в коллекцию Ruby объектов - PullRequest
1 голос
/ 17 января 2020

У меня есть код, который работает для одного экземпляра, но API, который я использую, возвращает массив данных. У меня есть класс для инкапсуляции этих данных:

class Brewery
  include ActiveModel::Serializers::JSON

  attr_accessor :id, :name

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

  def attributes
    instance_values
  end
end

И то, как выглядят возвращаемые данные, похоже на это

[
    {
        "id": 2,
        "name": "Avondale Brewing Co"
    },
    {
        "id": 44,
        "name": "Trim Tab Brewing"
    }
]

Я могу маршалировать один JSON га sh в класс с таким кодом:

brewery = Brewery.new
brewery.from_json(single_brewery)

Однако это не работает с массивом. Я относительно новичок с Ruby, поэтому я не совсем уверен, что это за функция или как минимум завершить хеши JSON в массиве, который можно сопоставить from_json.

Это работает, но кажется неуклюжим

breweries = JSON.parse(brewery_list).map { |b|
  brewery = Brewery.new
  brewery.from_json(b.to_json)
}

1 Ответ

1 голос
/ 18 января 2020

Я не уверен, почему вы находите отображение массива неуклюжим, но вы можете сделать свой Brewery фабричным.

class Brewery
  ...

  def self.many(brewery_list)
    JSON.parse(brewery_list).
         map(&:to_json).
         map(&Brewery.new.method(:from_json)
  end
end

И использовать его вот так

breweries = Brewery.many(brewery_list)
...