2012-11-05 36 views
0

即使字段沒有改變,每次保存對象時validates :uniqueness會被調用嗎?這不是性能問題嗎?驗證字段沒有改變時調用唯一性?

validates :name, :schedule_id, :uniqueness => true 

它似乎是這樣的情況。因此,在運行驗證之前,確保進行更改幾乎總是有必要的嗎?由於檢查每個字段的唯一性需要數據庫命中。

這會更好:

validates :name, :schedule_id, :uniqueness => true, :if => "name_changed? || schedule_id_changed?" 

而這更好的,如果有點冗長:

validates :name, :uniqueness => true, :if => :name_changed? 
validates :schedule_id, :uniqueness => true, :if => schedule_id_changed? 

要點在這裏:https://gist.github.com/4017019

+2

你的問題到底是什麼?重刑?你只是在尋找唯一性驗證始終運行的確認嗎? –

+0

是的。如果這個領域沒有改變,我的意思是。如果是這樣,就不應該爭論UniquenessValidator是否應該固有知道何時運行驗證。如果字段沒有改變,那麼在數據庫上運行一個相當昂貴,不必要的請求? –

+0

第二個看起來更加靈活,並且在對象沒有改變時幫助防止不必要的驗證,但就正常的驗證而言,每次將數據保存在數據庫中時都必須運行它,這一小部分開銷將會運行確保數據始終保持有效和正確的很長的一段路... –

回答

0

試試這個

validates :name, :uniqueness => true, :if => lambda {self.name_changed? } 
+0

雖然lambda不是必須的,如我在示例中所示,rails驗證採用基於髒屬性的條件。我試圖找到問題的根源,默認行爲是觀察字段的更改還是每次保存都會被調用。 –

+1

默認行爲沒有觀察到更改。這就是':if'和':除非'條件適用。 – deefour

+1

這與OP在問題結束時有什麼不同? –