У меня есть модель рецепта, в которой 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, но по-прежнему считается действительным).
Интересный билет. Содержит ответы, которые нужны ОР. В качестве хорошей практики я всегда убеждаюсь, что моя база данных имеет все необходимое Ограничения (валидации). На всякий случай, когда кто-то приходит с каким-то сценарием для заполнения моего db или каким-то SQL-редактором и начинает беспорядочно. Он гарантирует, что значение базы данных в базе данных само по себе является ясным. – nathanvda
Да, это я должен ударить себя, чтобы я всегда это делал. – tsdbrown