has_many / belongs_to关系的验证

时间:2010-05-25 03:57:51

标签: ruby-on-rails ruby validation foreign-keys has-many

我有一个食谱模型has_many成分(反过来属于食谱)。我希望成分依赖于食谱而存在;如果没有食谱,成分就不应该存在。

我正在尝试在成分中强制执行有效的食谱ID。我一直在使用Ingredient中的validates :recipe, :presence => true(Rails 3)语句执行此操作。如果我在将成分添加到ingredients集合之前保存配方,这可以正常工作。但是,如果我没有明确控制保存(例如当我从嵌套表单创建配方及其成分时),那么我收到错误:

  

配料配方不能为空白

我可以通过在Ingredient.recipe上删除状态验证来解决这个问题。但是,我并不特别喜欢这个,因为这意味着我在没有安全网的情况下工作。

在Rails中强制存在依赖的最佳方法是什么?

我正在考虑的事情(请评论每个人的智慧):

  • 在ingredients.recipe_id数据库列中添加一个非空约束,让数据库为我做检查。
  • 自定义验证,以某种方式检查成分是否在未保存的配方的成分集合中(因此不能具有recipe_id但仍被视为有效)。

1 个答案:

答案 0 :(得分:2)

看看这个:

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

过去我觉得我添加了:on => :验证器的更新选项,有助于收紧网络。我认为DB中的外键限制是个好主意,虽然我很少使用它:(