рельсы обратного вызова при сбое сохранения - PullRequest
0 голосов
/ 07 июня 2018

В Rails 5 я реализовал серию отношений, которые вызывают проблему "курица-яйцо" при сохранении одной сложной модели.(Идентификаторы необходимы для связи объектов, но их не существует до тех пор, пока они не будут сохранены.)

Мне нужно будет создавать и сохранять объекты трудным способом, но мне нужно очистить себя после сохраненияпроисходит сбой, поэтому я не получаю базу данных, заполненную пустыми объектами.

Как из модели, как убедиться, что мой код очистки запускается тогда и только тогда, когда сохранение не удается?Стандартный список обратных вызовов, кажется, не покрывает этот случай, если я что-то упустил.

1 Ответ

0 голосов
/ 07 июня 2018

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

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

В этом случае вам, скорее всего, понадобится транзакция :

A.transaction do 
   begin 
     a = A.create!(some_params)
     a.bs.create!(some_other_params)
   rescue ActiveRecord::RecordInvalid
     a
   end
end

Это оборачивает операцию в транзакцию базы данных, которая откатывается в случае сбоя любой из операций, оставляя базу данных нетронутой.

Вы можете встроить это в контроллер или обернуть его в объект обслуживания .

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