2017-02-18 74 views
0

我有一個需要詳細記錄的事務,即使它失敗了。我怎樣才能做到這一點?如果交易失敗,保留數據?

這是我的代碼:

# csv gets loaded etc. 
import = CsvImport.new 
import.logger += 'Starting import' 
ActiveRecord::Base.transaction do 
    import.logger += 'CSV loaded, starting import' 
    csv_array.each_with_index do |row, index| 
    begin 
     unless importer.has_key?(row[0]) 
     import.logger += 'Key not found' 
     raise StandardError 
     end 
     result = CsvImporter.import_line(row[0]) 
     import.logger += 'Imported line #{index} successfully' if result 
    rescue 
     import.logger += 'Transaction aborted!' 
    end 
    end 
    import.logger += 'Transaction successful!' 
end 

在一個失敗的事務,記錄器不僅具有「啓動導入」沒有任何交易裏面添加字符串 - 明顯。我如何保存這些數據?

回答

0

開始 - 救援塊只是一個包裝來捕捉異常。在你的情況下,你需要像你說的那樣進行交易。您可以在文檔使用這樣的

YourClass.transaction do 
    # do a lot of stuff 
end 

@yourmodel.transaction do 
    # do stuff ! 
end 

看:http://api.rubyonrails.org/classes/ActiveRecord/Transactions/ClassMethods.html

的交易和救援塊是可能的組合:看在節中的文檔「異常處理並回滾「

+0

'CsvImport.transaction'和'import.transaction'不起作用,或者沒有將數據保留在import.logger屬性中。我該如何使用它?這些文檔沒有告訴我任何新東西,因爲我按照它的記錄方式使用它。 – Cojones

+0

其他人知道如何保持交易的日誌輸出(或一般數據)? – Cojones

+0

@Cojones好的,現在我明白了。在您的代碼中,您將記錄器輸出分配給事務內定義的記錄器。當這一切都失敗時,一切都會得到恢復,輸出中也沒有任何東西。我認爲你可以嘗試: 1.在交易之外定義一個記錄器或者 2.直接將輸出變成日誌文件,而不是收集變量裏面的數據,然後打印它 –