2010-05-25 6 views
1

У меня есть модель рецепта, в которой has_many Ингредиенты (которые в свою очередь принадлежат к рецепту). Я хочу, чтобы Ингредиент существовал в зависимости от Рецепта; Ингредиент никогда не должен существовать без Рецепта.Валидации для отношения has_many/принадлежит_от

Я пытаюсь обеспечить наличие действительного идентификатора рецепта в Ингредиенте. Я делал это с инструкцией validates :recipe, :presence => true (Rails 3) в Ingredient. Это отлично работает, если я сохраню Рецепт перед добавлением Ингредиента к его коллекции ingredients. Однако, если у меня нет четкого контроля над сохранением (например, когда я создаю рецепт и его ингредиенты из вложенной формы), то я получаю сообщение об ошибке:

Ingredients recipe can't be blank

я могу обойти это просто отбросив проверку наличия на Ingredient.recipe. Однако мне это не особенно нравится, так как это означает, что я работаю без страховки.

Каков наилучший способ обеспечить зависимость от существования в Rails?

Вещи я рассматриваю (прокомментируйте мудрости каждого):

  • Добавление не-нулевое ограничение на ingredients.recipe_id столбец базы данных, и позволяя база данных сделать проверку для меня.
  • Пользовательская проверка, которая каким-то образом проверяет, находится ли Ингредиент в коллекции ингредиентов несохраненного рецепта (и, следовательно, не может иметь recipe_id, но по-прежнему считается действительным).

ответ

2

Взгляните на это:

https://rails.lighthouseapp.com/projects/8994/tickets/2815-nested-models-build-should-directly-assign-the-parent

В прошлом я думаю, что я добавил: на =>: обновление опции к считывающему устройству, помогает подтянуть немного сеть. Я думаю, что ограничение внешнего ключа в БД - хорошая идея, хотя я редко ее использую: (

+1

Интересный билет. Содержит ответы, которые нужны ОР. В качестве хорошей практики я всегда убеждаюсь, что моя база данных имеет все необходимое Ограничения (валидации). На всякий случай, когда кто-то приходит с каким-то сценарием для заполнения моего db или каким-то SQL-редактором и начинает беспорядочно. Он гарантирует, что значение базы данных в базе данных само по себе является ясным. – nathanvda

+0

Да, это я должен ударить себя, чтобы я всегда это делал. – tsdbrown

Смежные вопросы