Rails 3:验证组合值

Cim*_*imm 40 validation ruby-on-rails database-integrity validates-uniqueness-of ruby-on-rails-3

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

validates_uniqueness_of :husband, :scope => :wife
Run Code Online (Sandbox Code Playgroud)

在相应的迁移中,它可能如下所示:

add_index :family, [:husband, :wife], :unique => true
Run Code Online (Sandbox Code Playgroud)

这将确保丈夫/妻子组合在数据库中是唯一的.现在,在Rails 3中,验证语法发生了变化,范围属性似乎消失了.它现在看起来像:

validates :husband, :presence => true
Run Code Online (Sandbox Code Playgroud)

知道如何在Rails 3中实现组合验证吗?Rails 2.x验证仍然可以在Rails 3中使用,所以我仍然可以使用第一个示例,但它看起来很"旧",有更好的方法吗?

epo*_*olf 57

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

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

我想你想要的

validates :husband, :presence => true, :uniqueness => {:scope => :wife}
Run Code Online (Sandbox Code Playgroud)

(唯一性验证器实际上是ActiveRecord的一部分,而不是ActiveModel.开发人员如何设置它真的很有趣.它非常优雅.)

  • 我知道这是一个古老的问题,但我只是尝试了同样的方法而无法让它像这样工作,我不得不做两个单独的验证语句:validates:husband,:presence => true和validates :husband_id,:uniqueness => {:scope =>:wife_id} (2认同)