2012-09-03 7 views
19

Pregunta simple. Tengo un modelo de ActiveRecord que deseo realizar después del procesamiento DESPUÉS de que se guarde el registro. Entonces en el modelo tengo un método queue_for_processing que pega un trabajo en mi cola Resque. Para que esto sea ejecutar después de mi registro es éxito persistió he escrito lo siguiente en mi modelo:Rieles: Excepción en after_create stopping save

after_create :queue_for_processing 

bastante simple. Pensé que todo estaba funcionando como esperaba, EXCEPTO que anoche mi servidor redis se vino abajo y todo salió mal. Mis expectativas eran que el registro aún se guardara y que pudiera procesar el trabajo más tarde manualmente. Pero el método queue_for_processing arroja una excepción (comportamiento esperado) y evita que se guarde el registro.

¿Entiendo mal cómo funciona after_create? ¿O es correcto mi entendimiento y ocurre algo funky?

Gracias.

Respuesta

34

Sí, las devoluciones de llamada están todas envueltas en una transacción.

Básicamente, la siguiente causará un rollback:

  • retorno falsa de before_save o devoluciones de llamada similares
  • excepción en before_save o devoluciones de llamada similares
  • excepción en after_save o devoluciones de llamada similares (after_create)

Lo siguiente NO causa una reversión:

  • retorno falsa de after_save o devoluciones de llamada similares
  • excepción en after_commit

Si no desea que una excepción a causar un retroceso, utilice after_commit

+1

Impresionante, gracias por la rápida respuesta. Esto también fue útil: http://rails-bestpractices.com/posts/695-use-after_commit –

+0

Además, gracias por presentarme a after_commit. Veo que fue presentado en Rails3, pero debo haberme perdido la nota. Me gusta aprender cosas nuevas :-) –

+0

¡Gran explicación! +1 por concisión. –

Cuestiones relacionadas