2012-09-03 6 views
19

Einfache Frage. Ich habe ein ActiveRecord-Modell, das ich NACH der Speicherung des Datensatzes nachbearbeiten möchte. Im Modell habe ich also eine queue_for_processing-Methode, die einen Job in meine Resque-Warteschlange einfügt. Um dies auszuführen, nachdem mein Datensatz erfolgreich gespeichert wurde, habe ich Folgendes in mein Modell geschrieben:Schienen: Ausnahme in after_create stopping speichern

Ziemlich einfach. Ich hatte gedacht, dass alles wie erwartet funktionierte, außer dass letzte Nacht mein Redis-Server herunterging und die Dinge schief gingen. Meine Erwartungen waren, dass der Datensatz immer noch gespeichert werden würde und ich den Auftrag später manuell bearbeiten könnte. Die Methode queue_for_processing gibt jedoch eine Ausnahme (erwartetes Verhalten) aus und verhindert, dass der Datensatz gespeichert wird.

Missverstehe ich, wie after_create funktioniert? Oder ist mein Verständnis korrekt und etwas Funky passiert?

Danke.

Antwort

34

Ja, die Rückrufe sind alle in einer Transaktion verpackt.

Grundsätzlich wird die folgende ein Rollback verursachen:

  • return false aus before_save oder ähnlichen Rückrufen
  • Ausnahme in before_save oder Ähnliche Rückrufe
  • Ausnahme in after_save oder ähnlichen Callbacks (after_create)

Folgendes verursacht KEINEN Rollback:

  • return false aus after_save oder ähnliche Rückrufe
  • Ausnahme in after_commit

Wenn Sie ein Zurückkehren verursachen keine Ausnahme möchten, verwenden Sie after_commit

+1

Super, danke für die schnelle Antwort. Das war auch hilfreich: http://rails-bestpractices.com/posts/695-use-after_commit –

+0

Auch, danke für die Einführung in After_commit. Ich sehe, dass es in Rails3 eingeführt wurde, aber ich muss das Memo verpasst haben. Ich lerne gern neue Dinge :-) –

+0

Tolle Erklärung! +1 für Prägnanz. –