2011-12-24 77 views
3

唯一性驗證我對車型之一下面的驗證規則,軌道上更新

validates :reciept_num, :presence => true, 
         :numericality => { :only_integer => true }, 
         :uniqueness => true, 
         :on => :update, 
         :if => "!status_id.nil?"` 

現在,當我更新使用update_attributes方法的對象它給了我下面的錯誤

reciept_num: has already been taken

更新對象時,我沒有更改reciept_num屬性?那麼,爲什麼驗證在更新時失敗?

如果我沒有更新值,它必須是舊的,因此應該通過驗證。我錯過了什麼。

回答

5

首先,驗證不會基於屬性是否已更改而運行(除非您明確要求)。每次有唯一性驗證的記錄保存並且驗證可以運行(如:on,:if,選項所定義),它將檢查是否有除本身以外的任何實例與假定爲唯一的值。

由於您對驗證有條件,我想您最終可能會創建兩個具有相同收貨編號的實例,但這兩個實例的空值爲status_id。將status_id列和驗證啓動設置爲操作並查找其他實例。

另一件事是,因爲您的驗證是在更新只有你可以創建多個實例具有相同的收貨數量,再次嘗試更新記錄將觸發驗證。

我只是在猜測精確的場景。

+0

感謝您的回覆。讀完這個後,我想到我創建的種子數據有重複的條目。 – robert 2011-12-24 03:40:00

+1

而且,即使沒有條件,':uniqueness => true'實際上也不能保證唯一性,所以在數據庫中需要一個唯一的約束。 – 2011-12-24 03:40:26

+0

畝太矮了,你能詳細點嗎? – maletor 2012-09-07 07:20:53