验证子集之间的唯一性

时间:2013-03-18 05:47:55

标签: validation ruby-on-rails-3.2

我有一个“简单”的rails问题我找不到任何文档,我希望有人可以指出我正确的方向。

我有一个名为带有州属性的类别的模型。我希望能够在状态与'void'不同的所有记录中验证类别名称的唯一性。

为了实现这一目标,我现在已经创建了一个自定义验证器,但我想有一个内置选项可以实现。我是对的吗?

感谢。

1 个答案:

答案 0 :(得分:0)

您可能希望了解条件验证。例如,如果模型上有.not_void?方法,则可以使用:

validates :category, uniqueness: true, if: :not_void?

还有使用字符串(获取eval'd)或proc的选项 - 查看Validations guide以获取更多信息。


编辑:基于澄清问题的新答案

根据我的理解,使用内置验证器实现您所需的内容可能有点困难,因为您希望验证任何非空状态的唯一性。可以使用:scope选项来检查确定记录唯一性的限制,因此您可以查看向表中添加额外的布尔字段并使用它来确定唯一性。例如,如果您在表/模型中添加了void属性,则可以获得所需的行为

# category.rb
before_validation :set_void

def set_void
  self.void = (state == "void")
end

validates :category, uniqueness: { scope: :void }, unless: :void

这将在验证之前自动更新void属性,然后验证类别的名称与所有其他非空类别相比是唯一的(只要该类别的自身状态不为空)。