2012-07-18 41 views
0

我有一個模型與字段a,b。我想確保a和b的組合在表中是唯一的,所以a = 1,b = 2和a = 2,b = 1會引發衝突。兩個字段組合的軌道唯一性

我試過validates_uniqueness_of :a, :scope => :b,但它只確保沒有兩個 a = 1,b = 2行可以存在,我也想過濾出a = 2,b = 1。由於

+0

它是有道理的,這是不支持開箱的我會說。你應該建立你自己的驗證方法。 – Robin 2012-07-18 16:12:14

回答

2

內置的獨特性驗證不支持,據我所知。你將不得不編寫一個自定義的驗證,如:

class MyModel < AR::Base 

    validate :my_custom_validation 

    def my_custom_validation 
    if self.class.where("(a = :a AND b = :b) OR (a = :b AND b = :a)", {:a => a, :b => b}).exists? 
     errors.add(:a, :taken) 
    end 
    end 
end 

這將增加驗證錯誤屬性a是否存在具有任何記錄(A = 1和B = 2)或(a = 2, b = 1)。

+0

謝謝,它的工作原理。 – yngccc 2012-07-18 16:46:54

0
+0

沒有提到'a'和'b'是主鍵,所以我們可以聲明一個UNIQUE鍵約束來保證數據庫端的驗證。此外,這仍然可以像內置驗證一樣工作,而不是yngum想要的。它仍然允許兩行,其中a = 1,b = 2,另一個a = 2,b = 1 – Teoulas 2012-07-18 16:19:36

相關問題