Rails: Как преобразовать хэш массива объектов в json

#ruby-on-rails #json #ruby

Вопрос:

Я разработчик java и Js, поэтому я совершенно новичок в rails и ruby. В одном из моих проектов я использую rails для использования api и возврата обратно в js. Я преобразую ответ api в модель на ruby.

Теперь это в формате {KEY1=>[{array of objects(my model)}], KEY2=>[{array of objects(my model)}]}

Также ключи к модели находятся в snake_case. Мое требование состоит в том, чтобы просмотреть это и преобразовать это в JSON с помощью ключей camel case.

Ответ Api после преобразования в модель: { KEY1=>[{@person_name:"abc", @person_id="123"}],KEY2:[{@personName:"bca", @person_id="231"}] }

Желаемый результат: { KEY1:[{personName:"abc", personId:"123"}],KEY2:[{personName:"bca",personId:"231"}] }

До сих пор я пытался использовать .map и .transform_values, но не знаю, где я ошибаюсь.

Любая помощь будет признательна.

Комментарии:

1. Незначительное примечание: желаемый вывод не является допустимым JSON

2. Просто используйте JSON.generate для преобразования вашего хэша в JSON. ruby-doc.org/stdlib-3.0.0/libdoc/json/rdoc/…

3. Заботится ли он о преобразовании ключей в чехол camel? @dbugger

4. @AbhishekP — Чтобы уточнить, вы хотите преобразовать список моделей в json и подтвердить все ключи с помощью camelcase?

5. Да, именно @BroiSatse

Ответ №1:

Вы можете добавить в свой ApplicationRecord класс следующее:

 class ApplicationRecord < ActiveRecord::Base
  def serializable_hash(options = {})
    hash = super
    return hash unless options[:camelize]

    hash.deep_transform_keys { |key| key.to_s.camelize(options[:camelize]) }
  end
end
 

Это позволит вам вызывать to_json(camelize: :lower) практически любой объект:

 {
  KEY1: Person.where(...),
  KEY2: Person.where(...),
}.to_json(camelize: :lower)
 

Для автоматической сериализации всей коллекции

Ответ №2:

Вы можете сделать что-то вроде этого:

 { 
  KEY1: Person.where(...).select(:name, :id).map { |p| Hash[p.serializable_hash.map { |key, value| ["#{p.model_name.name.downcase}#{key.capitalize}", value] }] }, 
  KEY2: Person.where(...).select(:name, :id).map { |p| Hash[p.serializable_hash.map { |key, value| ["#{p.model_name.name.downcase}#{key.capitalize}", value] }] }
}.to_json