1

Я установил транзакцию ActiveRecord, однако, когда второй оператор выходит из строя, это не приводит к сбою транзакции. Вот мой код:транзакции ActiveRecord, не вызывающие ошибки

Contact.transaction do 
    contact = Contact.create(params) 
    channel = ContactChannel.create(contact: contact, phone: contact.phone) 
    # ContactChannel query raises a validation error 
    # puts "ERRORS: #{channel.errors.messages}" outputs the following: 
    #  {:channel_key=>["has already been taken"]} 
    contact # Still returns the contact that was created 
    end 

Любая идея, почему это не сработает, несмотря на ошибку проверки?

ответ

2

create! вместо create должен возбуждать исключение, которое должно привести к откату транзакции. Это, в основном, более строгая версия, и если исключение не создано, транзакция не прерывается.

Чтобы получить причину откат транзакции, вы можете обернуть свой оператор Transaction в блок begin (...) rescue и уловить ошибку ActiveRecord::Rollback и использовать его сообщение, чтобы вернуть причину сбоя транзакции.

+0

О, интересно! Есть ли способ вернуть сообщения об ошибках в этот оператор? –

+0

Я так думаю, вы могли бы выполнить «start (...) rescue -block или использовать« after_rollback »-callback. Возможно, вам придется поэкспериментировать с этим, я не собираюсь играть с этим. Возможно, сообщество может рассказать вам об этом больше. – jfornoff

+0

О, по-видимому, ActiveRecord повторяет исключение после отката транзакции, я отредактирую свой ответ, чтобы включить это. – jfornoff

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