2017-02-18 1 views
0

Ich habe eine Transaktion, die detaillierte Protokollierung benötigt, auch wenn es fehlschlägt. Wie kann ich das machen?Daten aufbewahren, wenn die Transaktion fehlschlägt?

Dies ist mein Code:

# 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 

In einer fehlgeschlagenen Transaktion, der Logger nur hat „Import starten“ ohne der zusätzlichen Saiten im Inneren der Transaktion - offensichtlich. Wie kann ich diese Daten behalten?

Antwort

0

Der Start-Rescue-Block ist nur ein Wrapper zum Abfangen von Ausnahmen. In Ihrem Fall brauchen Sie, wie Sie sagten, eine Transaktion. Sie können an die Dokumentation so etwas wie dieses

YourClass.transaction do 
    # do a lot of stuff 
end 

oder

@yourmodel.transaction do 
    # do stuff ! 
end 

Schauen Sie verwenden: http://api.rubyonrails.org/classes/ActiveRecord/Transactions/ClassMethods.html

Eine Kombination von Transaktion und Rettungs Block sind möglich: Schauen Sie sich die Dokumente im Abschnitt „Exception Handling und zurückrollen "

+0

' CsvImport.transaction' und 'import.transaction' funktionierte nicht oder lieber nicht die Daten im Attribut import.logger. Wie soll ich es benutzen? Die Ärzte haben mir nichts Neues erzählt, seit ich es so benutzt habe, wie es dokumentiert ist. – Cojones

+0

Hat sonst jemand eine Idee, wie man die Protokollausgabe (oder irgendwelche Daten im Allgemeinen) einer Transaktion behält? – Cojones

+0

@Cojones OK, jetzt verstehe ich. In Ihrem Code weisen Sie die Loggerausgabe einem Logger zu, der innerhalb der Transaktion definiert ist. Wenn dies fehlschlägt, wird alles rückgängig gemacht und es gibt nichts in der Ausgabe. Ich denke, Sie können versuchen: 1. Definieren Sie einen Logger außerhalb der Transaktion ODER 2. direkt die Ausgabe in Log-Dateien anstelle der Sammlung der Daten innerhalb einer Variablen und drucken Sie danach –

Verwandte Themen