Вложенные атрибуты в Rails, ключом которых является поле столбца - PullRequest
0 голосов
/ 13 февраля 2020

У меня есть Ruby проект на Rails, где у меня есть модель, которая принимает вложенные атрибуты для другой модели. Я не получаю ввод JSON из стандартной формы, но вместо этого из библиотеки, которая имеет заданный c формат.

Скажем, моя база данных выглядит так:

user columns: id, name, country
user_setting columns: key, value, user_id

Входные данные, которые я получаю, выглядят так:

{
  name: "name",
  country: "country",
  settings: {
     edit: true,
     autosave: false
  }
}

Я могу получить доступ к настройкам как к вложенным атрибутам, выполнив что-то вроде этого:

alias_attribute :settings, :settings_attributes

Но теперь проблема в том, что поле настроек читается как массив типа ["edit", "true"], который не может быть сохранен в базе данных.

Есть ли способ настроить модель на прием этого ввода и интерпретировать ключ как столбец key и значение как столбец value?

Я рассмотрел вопрос о реструктуризации всего ввода, чтобы он соответствовал ожиданиям Rails, но это выглядит как дополнительная работа (для меня и сервера) и немного грязно.

1 Ответ

1 голос
/ 14 февраля 2020

Нет, это не поддерживается в поведении accepts_nested_attributes_for, и AFAIK не может быть настроен для работы таким образом. Вместо этого вы можете определить «виртуальный метод», чтобы принять параметры ha sh, которые вручную устанавливают ожидаемый стиль accepts_nested_attributes_for:

def settings=(hash)
  self.settings_attributes = hash.map do |key, value|
    {
      id: user_settings.find_by(key: key)&.id # update any existing user_settings instead of duplicating
      key: key,
      value: value
    }
  end
end

. Это помечает связанные записи UserSetting как грязные, которые затем сохраняются. автоматически, так как вы объявили accepts_nested_attributes_for. Здесь происходит много волшебства c, поэтому вы можете сбалансировать знания в области интеллекта и структуры, необходимые для удобства обслуживания. Написание «тупого» решения может быть лучше в долгосрочной перспективе.

...