Обратные вызовы, ведущие себя как транзакция в рельсах 5 - PullRequest
0 голосов
/ 07 мая 2018

Я хочу создать запись модели после создания другой записи модели.

В основном я настроил Devise для создания действий в контроллере регистрации, но это не идеально. Я хотел бы инкапсулировать в транзакцию на случай, если что-то не получится при создании второй модели, если первая не будет создана или откатана.

Но, кажется, есть лучший метод, использующий обратные вызовы внутри модели, а не настраивая контроллер.

некоторые ссылки: Rails при создании транзакции , Rails: исключение при остановке after_create при сохранении и http://webonrails.com/2012/08/28/activerecord-after_commit-hook/

Хотя я даже не уверен, что понял концепцию.

Что я понимаю, так это то, что если я использую after_create :create_model_2_instance внутри первого файла модели, и это не удается, то создание записи этой самой модели также не удастся. Это бинарный результат для обеих моделей ..?

Где я немного запутался в последней предоставленной ссылке http://webonrails.com/2012/08/28/activerecord-after_commit-hook/ Автор говорит:

" Большинство разработчиков используют обратные вызовы ActiveRecord after_create / after_update / after_destroy для создания фонового задания, истечения срока действия кэша и т. Д., Но они не осознают, что эти обратные вызовы по-прежнему заключены в транзакции базы данных, они, вероятно, получили неожиданные результаты, такие как приложение поставило в очередь задание, но запись не была создана / обновлена ​​(откат транзакции)."

Таким образом, в основном он применяет тот факт, что after_create инкапсулируется в транзакцию. Допустим, я ставлю в очередь фоновое задание, которое запускается через 3 часа после создания записи. В случае неудачи исходная запись будет уничтожена / откатана через 3 часа после ее создания?

1 Ответ

0 голосов
/ 07 мая 2018

Да, after_create оборачивается в транзакции в рельсы, так что все транзакции должны быть зафиксированы в базе данных, если какая-либо из записей не может быть сохранена в базе данных, тогда откат всего блока транзакции.

В качестве обходного пути, если вы хотите, чтобы каждая вставка представляла собой отдельную транзакцию, вы можете использовать обратный вызов after_commit, в котором после завершения транзакции ее больше нельзя будет откатить.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...