2017-02-18 18 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

@ Коджоуз ОК, теперь я понимаю. В коде вы назначаете вывод журнала на регистратор, который определен внутри транзакции. Когда это не удается, все возвращается и ничего не выводится. Я думаю, вы можете попробовать: 1. определить логгер вне транзакции ИЛИ 2. непосредственно сделать вывод в лог-файлы вместо сбора данных внутри переменной и напечатать их потом –

 Смежные вопросы

  • Нет связанных вопросов^_^