He estado experimentando con esto. Parece que si su rescate capta la excepción que habría causado la reversión, la parte de la transacción que ya pasó se compromete. En mi caso, quiero que la base de datos vuelva a la forma en que estaba antes de que comenzara la transacción, pero aún quiero manejar la excepción.
terminé con esto:
self.transaction do
first_operation
begin
operation_that_might_violate_db_constraint
rescue ActiveRecord::RecordNotUnique
#deal with the error
raise ActiveRecord::Rollback #force a rollback
end
end
La parte raise ActiveRecord::Rollback
se asegura de que la transacción se deshace por completo. Sin él, los cambios de first_operation
terminarían comprometiéndose.
El ActiveRecord :: Rollback es un tipo especial de excepción que no supera el nivel de la transacción, por lo que no terminará con una excepción no detectada que representa la página de error.
No estoy seguro de que esta sea la manera estándar de hacer esto, pero parece que funciona.
favor, eche un vistazo en esta respuesta: http://stackoverflow.com/questions/14329877/render-failing-to-render-correct-template-in-rescue-from- activerecordrollback/35731832 # 35731832 – monteirobrena