我有一個模型與字段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。由於
我有一個模型與字段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。由於
內置的獨特性驗證不支持,據我所知。你將不得不編寫一個自定義的驗證,如:
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)。
謝謝,它的工作原理。 – yngccc 2012-07-18 16:46:54
沒有提到'a'和'b'是主鍵,所以我們可以聲明一個UNIQUE鍵約束來保證數據庫端的驗證。此外,這仍然可以像內置驗證一樣工作,而不是yngum想要的。它仍然允許兩行,其中a = 1,b = 2,另一個a = 2,b = 1 – Teoulas 2012-07-18 16:19:36
它是有道理的,這是不支持開箱的我會說。你應該建立你自己的驗證方法。 – Robin 2012-07-18 16:12:14