Rails 3:验证组合值

40

在Rails 2.x中,您可以使用验证确保您拥有唯一的组合值,如下所示:

validates_uniqueness_of :husband, :scope => :wife

在相应的迁移中,它可能看起来像这样:

add_index :family, [:husband, :wife], :unique => true

这将确保数据库中的丈夫/妻子组合是唯一的。现在,在Rails 3中,验证语法已更改,范围属性似乎已经消失。它现在的样子是:

validates :husband, :presence => true
任何想法如何在Rails 3中实现组合验证?Rails 2.x的验证在Rails 3中仍然有效,因此我仍然可以使用第一个示例,但它看起来很“陈旧”,有更好的方法吗?
1个回答

57

请耐心等待。ActiveModel中的validates方法的工作方式是查找验证器。

:presence => true 查找PresenceValidator并将选项true传递给验证器的初始化程序。

我认为您想要

validates :husband, :presence => true, :uniqueness => {:scope => :wife}

(唯一性验证器实际上是ActiveRecord的一部分,而不是ActiveModel。开发人员设置这个非常有趣。它相当优雅。)


这听起来很棒,而且非常简洁,但是...在我尝试的“单模型项目”中它不起作用。你们有做任何特殊处理吗?我使用了2个字符串,也尝试了2个整数,但验证仅仅通过了。 - Cimm
我正在使用 validates :contents, :presence => true, :uniqueness => {:scope => :comment_thread_id, :message => "已经被提出,请添加有意义的内容"} - epochwolf
哎呀,非常抱歉,是我搞错了。我试错了测试,它确实有效。非常感谢您的超快速和优秀的回答! - Cimm
2
我知道这是一个有点老的问题,但我刚刚尝试了这个方法,无法像这样工作,我不得不执行两个单独的验证语句:validates:husband,:presence => true和validates:husband_id,:uniqueness => {:scope => :wife_id}。 - Dave Hollingworth
@fishwebby 我正在使用Rails 3.0.3,配合validates :visibility, :presence => true, :inclusion => { :in => VISIBILITIES },但我还没有遇到过那个问题。 - epochwolf
@epochwolf 我没能让 :uniqueness 部分工作起来 - 我也在使用 Rails 3.0.3 - 因为我已经用两个单独的验证语句让它工作了,所以我没有进一步调查。 - Dave Hollingworth

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接