40

在Rails 2.x中,您可以使用验证,以确保你有这样一个独特的组合值:的Rails 3:验证组合值

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中仍然有效,所以我仍然可以使用第一个示例,但看起来如此“古老”,有没有更好的方法?

回答

57

忍受我。 ActiveModel中validates方法的工作方式是查找Validator。

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

我想你想

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

(唯一性验证实际上是的ActiveRecord的一部分,而不是加载ActiveModel。这真的很有趣的开发人员如何设置此。这是相当优雅。)

+1

我只是证实了这一点适用于我自己的应用程序。 – epochwolf 2010-03-28 17:44:06

+0

这听起来很棒,很干净,除了......它在我尝试过的“一个模型项目”示例中不起作用。你们有没有做特别的事情?我使用了2个字符串,并尝试了2个整数,但验证通过。 – Cimm 2010-03-30 14:17:14

+0

我正在使用'validates:contents,:presence => true,:uniqueness => {:scope =>:comment_thread_id,:message =>“已经说过了,请添加一些有意义的内容”} – epochwolf 2010-03-30 17:38:55