1

我有一个食谱模型,它有_many 成分(又属于_torecipe)。我希望成分依赖于食谱而存在;没有食谱,成分永远不应该存在。

我正在尝试强制在成分中存在有效的配方 ID。我一直在使用validates :recipe, :presence => true成分中的(Rails 3)声明来做到这一点。ingredients如果我在将成分添加到它的集合之前保存配方,这很好用。但是,如果我没有对保存的明确控制(例如当我从嵌套表单创建食谱及其成分时),那么我会收到错误消息:

配料配方不能为空

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

在 Rails 中实施存在依赖的最佳方法是什么?

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

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

1 回答 1

2

看看这个:

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

在过去,我想我已经为验证器添加了一个 :on => :update 选项,有助于稍微收紧网络。我认为数据库中的外键限制是个好主意,虽然我很少使用它:(

于 2010-05-25T09:31:01.467 回答