Rails объединяет несколько объектов в один массив - PullRequest
0 голосов
/ 11 июня 2018

Я создаю 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

Может кто-нибудь помочь мне реструктурировать объект, как в ожидаемом результате.

Ответы [ 4 ]

0 голосов
/ 11 июня 2018
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.Это не однострочный и, вероятно, не самый элегантный способ сделать это, но он должен работать.

0 голосов
/ 11 июня 2018

Вы можете просто отобразить все местоположение и присвоить его хэшу [: country]

 2.4.0 :044 > hash[:country].map! { |c| c[:location] }
 => ["US", "CH"] 
 2.4.0 :045 > hash
 => {:id=>"180a096", :country=>["US", "CH"]} 
0 голосов
/ 11 июня 2018

Как уже упоминалось в моем комментарии , вы можете сделать в одной строке, как

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"]}]}
0 голосов
/ 11 июня 2018

Если ваш хеш называется hash, вы можете сделать:

hash[:country].map {|h| h[:location]}

Если вам нужно получить доступ к атрибутам на связанных моделях, вы можете сделать:

countries.pluck(:location)

Не имеет отношения к вопросу, но когда мне приходится управлять информацией о стране в своем приложении, я склонен использовать гем countries.https://github.com/hexorx/countries

У него есть все виды полезных вспомогательных методов, и он не позволяет вам поддерживать стандартизированную информацию о стране.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...