2017-02-18 96 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.直接将输出变成日志文件,而不是收集变量里面的数据,然后打印它 –

相关问题