我正在创建API。使用ActiveRecords。我遇到的问题 国家的多个数组对象,我想要一个包含所有位置的数组
当前输出
{
"id": "180a096",
"country": [
{
"location": "US"
},
{
"location": "CH"
}
]
}
预期输出
{
"id": "180a096",
"country": [
{"location":["US","CH"]}
]
}
代码
def as_json(options={})
super(:only => [:id ],:include => { :country => { :only => :location } })
end
任何人都可以帮我按预期的输出重组对象。
答案 0 :(得分:0)
如果你的哈希被称为hash
,你可以这样做:
hash[:country].map {|h| h[:location]}
如果您必须访问相关模型上的属性,您可以执行以下操作:
countries.pluck(:location)
与此问题无关,但当我必须在我的应用中管理国家/地区信息时,我倾向于使用countries
gem。 https://github.com/hexorx/countries
它有各种有用的辅助方法,它可以防止您必须维护标准化的国家/地区信息。
答案 1 :(得分:0)
您可以简单地映射所有位置并将其分配给哈希[:country]
2.4.0 :044 > hash[:country].map! { |c| c[:location] }
=> ["US", "CH"]
2.4.0 :045 > hash
=> {:id=>"180a096", :country=>["US", "CH"]}
答案 2 :(得分:0)
如我的评论中所述,您可以在一行中执行
actual_hash[:country].map! { |country| country[:location]}
actual_hash # => {:id=>"180a096", :country=>["US", "CH"]}
输出干净但不符合预期。
或者,更多一行来获得准确的输出:
location_array = [{location: []}]
actual_hash[:country].each { |country| location_array[0][:location] << country[:location]}
actual_hash[:country] = location_array
actual_hash # => {:id=>"180a096", :country=>[{:location=>["US", "CH"]}]}
答案 3 :(得分:0)
def rearrange_json(input)
input_hash = JSON.parse(input)
output_hash = input_hash.clone
output_hash[:country] = {location: []}
input_hash[:country].map {|l| output_hash[:country][:location] << l[:location] }
output_hash.as_json
end
使用此方法,您可以将json转换为哈希值,然后通过将国家/地区代码添加为输出哈希的[:country][:location]
键的值来重新排列其所需内容,并最终得到一些正确的结果格式化的json。它不是一个单行,也可能不是最优雅的方式,但它应该有效。