【问题标题】:Validations for a has_many/belongs_to relationshiphas_many/belongs_to 关系的验证
【发布时间】:2010-05-25 03:57:51
【问题描述】:

我有一个配方模型,它有_many 成分(又属于_torecipe)。我希望成分依赖于食谱而存在;没有配方就不能存在成分。

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

配料配方不能为空

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

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

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

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

【问题讨论】:

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


    【解决方案1】:

    看看这个:

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

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

    【讨论】:

    • 有趣的票。包含 OP 需要的答案。作为一种好的做法,我始终确保我的数据库具有所有必要的约束(验证)。以防万一有人带着一些脚本来填充我的数据库,或者带着一些 SQL 编辑器开始乱搞。它确保数据库中数据模型的含义本身是明确的。
    • 是的,这是一个合理的举动。我需要踢自己以确保我总是这样做。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-10-23
    • 1970-01-01
    • 1970-01-01
    • 2015-10-15
    • 1970-01-01
    相关资源
    最近更新 更多