2012-05-03 81 views
1

在我的模型中,我有自定義驗證方法將請求發送到外部服務。基於響應,我添加了錯誤errors數組,如果有的話。需要從驗證寫入數據庫

如果有錯誤,我還需要創建ErrorLog模型的新記錄,它表示錯誤日誌。問題是,如果驗證失敗,它將在數據庫上執行ROLLBACK,並且所有新的ErrorLog記錄都將丟失。實施它的最佳方式是什麼?

我也應該說after_rollback不是因爲某種原因而被調用的。

回答

3

after_rollback僅在事務處理期間保存或銷燬的對象上調用。您是否在您的主課程或您的ErrorLog課程上設置了after_rollback回調?

事實上,使用ErrorLog類的after_rollback回調似乎是最簡單的方法。你要去哪裏失去ErrorLog情況下的唯一情況是,如果事務回滾所以這樣的事情應該工作:

class MyClass < ActiveRecord::Base 
    before_save :check_external 

    def check_external 
    unless external_says_i_am_okay? 
     ErrorLog.create!(:message => 'oops') 
    end 
    end 
end 

class ErrorLog < ActiveRecord::Base 
    after_rollback :save_anyway 

    def save_anyway 
    self.save! 
    end 
end 

當然,說了這麼多,你可能要考慮讓一個表現外部服務來驗證您的模型。例如,如果您在Web請求的範圍內創建對象,它可能不夠快。您還需要確保ErrorLog#save不會因爲您在此點之外超出交易範圍而失敗。

+0

感謝您的幫助。我明白我的錯誤,並在'ErrorLog'模型中設置'after_rollback'。但'self.save!'什麼都不做。我在日誌中有'SQL(0.1ms)BEGIN \ n SQL(0.1ms)COMMIT',沒有任何插入。 – Flexoid

+0

我想知道它是否認爲它已經被保存了,因爲它在交易中被「保存」了。你可能想嘗試調用它上面的「觸摸」或改變一個屬性,看看它是否會將保存變爲生命。值得檢查的回調肯定是通過登錄在那裏調用。 – Shadwell

+0

僅限於ErrorLog.create!(self.attributes)我可以確定該錯誤已保存。它看起來像骯髒的黑客,但我不知道,還有什麼要做。感謝幫助。 – Flexoid