2012-11-09 62 views
0

我在Rails中遇到了一個很奇怪的問題。我在父對象上使用update_attributes來更新所有子對象。這些子對象具有(自定義)驗證功能,並且確實可以正常工作,這意味着如果我給出錯誤的值驗證觸發器並返回錯誤。爲什麼Rails update_attributes在保存前調用驗證

現在我處於一種奇怪的情況,其中一個模型在數據庫中無效(我們不要質疑爲什麼,我們只是說我可以在數據庫中運行一些SQL來使模型無效)。如果我進入我的應用程序,我可以看到無效的值,這很好。我修復了這些值並再次保存,我可以看到,在保存新值之前加入了驗證調用的ruby代碼,這意味着我將得到一個錯誤,並且Rails將永遠不會執行SQL以實際更新值到正確的。

我希望以上是有道理的。你有什麼想法嗎?或者你認爲有什麼我可以忽略的?

SOLUTION:

發生了什麼事是一個多一對多的關係被新的數據被替換之前驗證現有的DB數據。基本結構是這樣的:

class User 
    has_many :user_permissions 
    has_many :permissions, :through => :model_permissions 

class Permission 
    has_many :user_permissions 
    has_many :users, :through => :user_permissions 

class UserPermission 
    belongs_to :user 
    belongs_to :permission 
    validates_associated :user  # THIS was causing the problem 
    validates_associated :permission # and THIS as well 

我只是去掉了validates_associated指令,因爲我驗證鏈接的記錄獨立反正。

回答

0

那麼,在將數據寫入數據庫之前,Rails會運行您的驗證(請參閱Active Record callback sequence),因此驗證錯誤意味着您試圖保存的某個模型部分無效。它可能是一個相關的模型,其中包含驗證打開時發生的錯誤,或者只是一些缺失的部分 - 無論如何,只要看看你得到的錯誤是什麼。如果你想跳過驗證,你可以選擇#update_attribute(只更新一個屬性),調用#save(false),使用模型的+ udpate_all方法類或甚至下降到ActiveRecord :: Base.connection.execute - 這些都不會打擾你與驗證錯誤:)

+0

'它可能是一個相關模型包含錯誤'...這指出我在正確的方向。多對多鏈接表正在驗證相關模型,在我有機會保存(並驗證)新數據之前,使用舊數據驗證這些模型。更新我的問題。謝謝! – Tallmaris

相關問題