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