2012-09-03 16 views
19

Proste pytanie. Posiadam model ActiveRecord, który chcę wykonać przetwarzanie po AFTER rekord zostanie zapisany. Tak więc w modelu mam metodę queue_for_processing, która umieszcza zadanie w mojej kolejce Resque. Aby wykonać to po pomyślnym zachowaniu mojej płyty, napisałem w moim modelu:Szyny: Wyjątek w after_create stopping save

after_create :queue_for_processing 

Całkiem proste. Myślałem, że wszystko działa zgodnie z oczekiwaniami, Z WYJĄTKIEM ostatniej nocy mój serwer Redisa przestał działać i wszystko poszło nie tak. Moje oczekiwania były takie, że zapis byłby nadal zapisany i mogłem przetworzyć pracę później ręcznie. Ale metoda queue_for_processing rzuca wyjątek (oczekiwane zachowanie) i zatrzymuje zapis przed zapisaniem.

Czy nie rozumiem, jak działa after_create? Czy moje zrozumienie jest poprawne i coś ciekawego się dzieje?

Dzięki.

Odpowiedz

34

Tak, wszystkie wywołania zwrotne są zawijane podczas transakcji.

Zasadniczo dodaje spowoduje wycofywania:

  • powrotu fałszywego z before_save lub podobnych zwrotnych
  • wyjątku w before_save lub podobnych zwrotnych
  • wyjątku w after_save lub podobnych wywołania zwrotne (after_create)

Następujące NIE powodują cofnięcia:

  • return false z after_save lub podobnych callbacków
  • wyjątek w after_commit

Jeśli nie chcesz wyjątek spowodować wycofywanie użyć after_commit

+1

Niesamowite, dziękuję za szybką odpowiedź. To było również pomocne: http://rails-bestpractices.com/posts/695-use-after_commit –

+0

Dziękuję również za wprowadzenie mnie do after_commit. Widzę, że został wprowadzony w Rails3, ale musiałem przegapić notatkę. Lubię uczyć się nowych rzeczy :-) –

+0

Świetne wyjaśnienie! +1 za zwięzłość. –

Powiązane problemy