Обратные вызовы моделей являются одной из наиболее часто используемых и неправильно используемых функций в Rails.Они отлично подходят для добавления простых обратных вызовов в жизненный цикл модели, но их очень трудно контролировать, когда они запускаются (например, в ваших тестах, где они все замедляют), или использовать поток, чтобы добавить логику приложения.
Если ваш обратный вызов когда-либо влияет больше, чем модель, определяющая обратный вызов, это очень хороший признак того, что вам следует пересмотреть вопрос об использовании обратного вызова.
В этом случае вам, скорее всего, понадобится транзакция :
A.transaction do
begin
a = A.create!(some_params)
a.bs.create!(some_other_params)
rescue ActiveRecord::RecordInvalid
a
end
end
Это оборачивает операцию в транзакцию базы данных, которая откатывается в случае сбоя любой из операций, оставляя базу данных нетронутой.
Вы можете встроить это в контроллер или обернуть его в объект обслуживания .