#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