Rails: создание экземпляров и ассоциаций после проверки существующей записи (и использования существующей записи) - PullRequest
0 голосов
/ 07 октября 2018

У меня очень специфическая проблема, и я не могу найти решение для нее.Простите, если это слишком конкретно, но я не знаю, где еще спросить.

Я пытаюсь создать экземпляр модели, которая имеет has_many через ассоциации, но ассоциации has_many являются частьютаблица типа «основная» запись, в которой существует только 1 запись чего-либо (объединенная с таблицей соединения).

Я пытаюсь реализовать следующее:

Создать рецепт, используя acceptpts_nested_attributes_for с Ingredients,Ингредиент должен использоваться, только если он не найден в таблице ингредиентов.Однако, если он найден, я хочу использовать уже существующую запись.

Если нам нужен конкретный пример, то здесь:

Скажем, мы создаем рецепт "Чили", который состоит изфасоль, лук, говяжий фарш.Фасоль и лук являются совершенно новыми ингредиентами (их нет в таблице ингредиентов), но говяжий фарш уже существует в таблице.Вместо того, чтобы создавать другую запись из говяжьего фарша, я хочу использовать уже существующую запись из говяжьего фарша, найденную в таблице ингредиентов.

Как мне это сделать?

Я подумал, что, возможно, я мог бы использовать before save: :check_if_exists вызов на модели Рецепта с check_if_exists проверкой всех компонентов формы, существуют они или нет.Соответствующий код:

Модель рецепта

before_save :check_if_exists

def check_if_exists
  self.ingredients.each do |ingredient|
    if Ingredient.exists?(ingredient.name)
      return ingredient
    else
      @ingredient = Ingredient.new(name: ingredient.name)
      return @ingredient
    end
  end
end

Я знаю, что приведенный выше код - полная чушь, но, надеюсь, моя идея дойдет до конца.Я хотел бы использовать существующую запись, если она уже существует, в противном случае создайте новую.

Хотя я не могу обернуть голову, как это сделать.Любая помощь приветствуется!

1 Ответ

0 голосов
/ 07 октября 2018

В документации (https://api.rubyonrails.org/classes/ActiveRecord/NestedAttributes/ClassMethods.html) довольно ясно сказано, что вы можете добавить id s к вашим хэшам связанных записей, и вместо создания новых ингредиентов будут использоваться старые.

Так что яподумайте в своем методе очистки, который фильтрует параметры для сохранения, вы можете добавить некоторые проверки, если ингредиент существует. Что-то вроде этого:

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