2014-01-24 4 views
0

У меня есть набор вставок и обновлений, которые нужно отбросить, если какой-либо из них завершится с ошибкой. Хорошая часть этих обновлений и вставок абстрагируется, поэтому их можно повторно использовать. Когда я начинаю транзакцию, а затем вызвать метод пнуть отведенной вставки, отказ не передается до исходного блока транзакции - это просто обязывает все до этого методаОткат всего, если сбой метода в транзакции

def decline_check 
     Check.transaction do 
      # Set default updates, then a voided date if the check has already been printed. 
      check_attributes = {:status => 'Voided', :status_date => Time.now.strftime('%Y-%m-%d')} 
      check_attributes[:voided_date] = Time.now.strftime('%Y-%m-%d') if check.status == "Printed" 

      # Update check status 
      check.update_attributes!(check_attributes) 

      decline(current_user) 
     end 
    end 

private 

    def decline current_user 
     # execute some insert here that fails 
    end 

Как я могу получить A откат в decline для запуска отката в decline_check?

ответ

0

Вы можете использовать raise ActiveRecord::Rollback, если вы хотите вручную выполнить откат транзакции.

Лучшим вариантом было бы попытаться найти способ проверки перед взаимодействием с базой данных.

Ваш комментарий в decline current_user говорит, что вставка будет терпеть неудачу. Если вы ссылаетесь на сбой уровня базы данных, он должен автоматически запускать откат.

+0

Вы абсолютно правы. Размещение этого ручного рейза там работало так, как ожидалось - моя проблема была выше, что неправильно отображало сообщение об ошибке. Благодарю. –

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