【问题标题】:ActiveModel::Serializers::JSON - How to map an array of JSON from a returned string to an collection of Ruby objectsActiveModel::Serializers::JSON - 如何将 JSON 数组从返回的字符串映射到 Ruby 对象的集合
【发布时间】:2020-01-17 19:41:39
【问题描述】:

我有适用于单个实例的代码,但我正在使用的 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 哈希编组到类:

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)
}

【问题讨论】:

  • 我开始写一个答案,展示如何根据您的需要对 ActiveModel::Serializers::JSON 模块进行猴子补丁,但老实说,我建议您为此编写自己的模块,因为功能不会那么复杂听起来你已经知道自己需要什么了。

标签: ruby active-model-serializers activemodel


【解决方案1】:

我不确定您为什么会觉得映射数组很笨拙,但您可能会将您的 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)

【讨论】:

  • 在同一个调用中必须调用 JSON.parse 然后调用 to_json 后跟 from_json 感觉更不对劲。如果这就是它的完成方式,那就是它的完成方式。
猜你喜欢
  • 2018-05-29
  • 1970-01-01
  • 2021-01-09
  • 1970-01-01
  • 2019-07-18
  • 1970-01-01
  • 1970-01-01
  • 2019-01-25
  • 1970-01-01
相关资源
最近更新 更多