Вложенные атрибуты Rails JSON Форматирование

Я пытаюсь переопределить метод 'as_json', чтобы включить вложенные атрибуты для объекта, но у меня возникают проблемы с правильным вложением JSON.

В настоящее время у меня есть это в Rails для моего метода as_json.

// User.rb

def as_json(options = {})
  json = {:id => id, :name => name,
    :settings_attributes => settings.select(:id,:name), 
    :setting_options_attributes => setting_options.select(:id, :amount)}
  json
end

Тем не мение, setting_options_attributes должны быть вложены в settings_attributes и я не могу найти правильный синтаксис для достижения этой цели.

1 ответ

Решение

Если предположить, settings а также settings_options уже хэши, вы должны быть в состоянии сделать это:

// User.rb
def as_json(options = {})
  {
    id: id, 
    name: name,
    settings_attributes: settings.select(:id,:name).merge({
      setting_options_attributes: setting_options.select(:id, :amount)
    }, 
  }
end

Если settings а также settings_options Модели, то вам, вероятно, нужно сделать что-то вроде этого:

// User.rb
def as_json(options = {})
  {
    id: id, 
    name: name,
    settings_attributes: settings.select(:id,:name).map(&:attributes), 
  }
end

// Setting.rb
def attributes
  {
    id: id, 
    name: name,
    setting_options_attributes: setting_options.select(:id,:amount).map(&:attributes), 
  }
end

Это немного сбивает с толку в этом SettingOption кажется, принадлежит User (как вы ссылаетесь на это непосредственно), но вы хотите вложить его в Setting, что подразумевает, что это отношение "own_to:through", и в этот момент я думаю, что вы должны сделать Setting ответственность за вложенность.

Наконец, если вы хотите разработать сложный вывод JSON, а не переопределять as_json, вам следует рассмотреть возможность использования jbuilder (который обычно связан с rails), поскольку он перемещает вашу логику JSON из вашей модели в представление, что, возможно, является более подходящим место для построения того, как вы просматриваете ваши данные. JBuilder намного лучше проектирует сложный JSON.

Другие вопросы по тегам