1
在我的模型中,我有自定義驗證方法將請求發送到外部服務。基於響應,我添加了錯誤errors
數組,如果有的話。需要從驗證寫入數據庫
如果有錯誤,我還需要創建ErrorLog
模型的新記錄,它表示錯誤日誌。問題是,如果驗證失敗,它將在數據庫上執行ROLLBACK
,並且所有新的ErrorLog
記錄都將丟失。實施它的最佳方式是什麼?
我也應該說after_rollback
不是因爲某種原因而被調用的。
在我的模型中,我有自定義驗證方法將請求發送到外部服務。基於響應,我添加了錯誤errors
數組,如果有的話。需要從驗證寫入數據庫
如果有錯誤,我還需要創建ErrorLog
模型的新記錄,它表示錯誤日誌。問題是,如果驗證失敗,它將在數據庫上執行ROLLBACK
,並且所有新的ErrorLog
記錄都將丟失。實施它的最佳方式是什麼?
我也應該說after_rollback
不是因爲某種原因而被調用的。
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
不會因爲您在此點之外超出交易範圍而失敗。
感謝您的幫助。我明白我的錯誤,並在'ErrorLog'模型中設置'after_rollback'。但'self.save!'什麼都不做。我在日誌中有'SQL(0.1ms)BEGIN \ n SQL(0.1ms)COMMIT',沒有任何插入。 – Flexoid
我想知道它是否認爲它已經被保存了,因爲它在交易中被「保存」了。你可能想嘗試調用它上面的「觸摸」或改變一個屬性,看看它是否會將保存變爲生命。值得檢查的回調肯定是通過登錄在那裏調用。 – Shadwell
僅限於ErrorLog.create!(self.attributes)我可以確定該錯誤已保存。它看起來像骯髒的黑客,但我不知道,還有什麼要做。感謝幫助。 – Flexoid