【问题标题】:Rails uniqueness validation on nil values对 nil 值进行 Rails 唯一性验证
【发布时间】:2014-10-24 15:09:32
【问题描述】:

我有一个具有“term”和“section”属性的 rails 模型。 我想对这些属性进行唯一性约束,所以我尝试了这个:

validates_uniqueness_of :term, scope: :section

这仅在 'term' 和 'scope' 都不是 nil 时有效,但我希望约束在存在 nil 值时仍然适用。查看 ActiveRecord::Validations docs,我看到将 'allow_nil' 设置为 false 将防止在 a 值为 nil 时跳过验证。但是这个选项的默认值已经是 false。

无论如何,我尝试将 allow_nil 设置为 false 和 true,但行为没有变化。有谁知道为什么当有 nil 值时我无法进行验证?

【问题讨论】:

  • :scope设置为:section的目的是什么?
  • @Ali 对于section 具有相同值的所有记录,term 必须是唯一的。
  • @user2745175 尝试更新 rails 或指定您使用的版本。如果 rails update 没有帮助,您的数据库版本也可能有用。我刚刚使用 Rails 4.1.6 和 PG 9.1 测试了您的案例,它可以按您的预期工作。

标签: ruby-on-rails ruby activerecord


【解决方案1】:

你可以添加

validates_presence_of :term, :section

【讨论】:

  • 这如何允许 nil 值?
  • 他想将allow_nil 设置为false,这显然不能按预期工作,所以我认为这会达到预期的效果。你是怎么理解这个问题的?
  • 这不是我真正想要的。我希望唯一的约束是术语和部分的组合。我不想单独对它们进行唯一约束。编辑:哦,我误读了这个建议。我不能强制部分的存在。它应该可以为零。
  • @user2745175: term 也可以为零吗?他们都可以是nil吗?
  • 只有section可以为nil
【解决方案2】:

“我希望唯一约束是术语和部分的组合。我不想单独对它们进行唯一约束。”

这就是跨领域验证;您需要构建一个自定义验证器(使用 validates_with)。 Read about that here.

【讨论】:

  • validates_uniqueness_of 明确支持此功能。不需要自定义验证器。
  • 除非他希望 nil 值不计入唯一性约束。
  • ":allow_nil - 如果设置为 true,则在属性为 nil 时跳过此验证(默认为 false)。"在我看来,就唯一性约束而言,任何空列值要么被忽略,要么不被忽略。听起来我一定是读错了?这是否意味着如果主要属性(不在范围内的属性)为零,则跳过验证?如果是这样的话,那就太令人惊讶了,因为那是一种不太有用的行为:/。
猜你喜欢
  • 1970-01-01
  • 2018-04-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-02-03
  • 1970-01-01
  • 2016-03-29
相关资源
最近更新 更多