#ruby-on-rails #rails-activerecord #ruby-on-rails-6
#ruby-на-рельсах #рельсы-activerecord #ruby-on-rails-6
Вопрос:
После обновления до Rails 6 я не могу запустить обратный вызов after_rollback. Я проверил, что это не работает на Rails 6.0.3.6
или 6.1.3.1
. Любая помощь приветствуется!
class User < ActiveRecord::Base
after_rollback do |user|
puts "You have rolled back!"
end
validates_presence_of :name
end
> User.first.update!(name: nil)
ActiveRecord::RecordInvalid (Validation failed: Name cant be blank)
> User.create!
ActiveRecord::RecordInvalid (Validation failed: Name cant be blank)
Согласно документации after_rollback
, он должен запускаться после отката create, update или destroy
Комментарии:
1. Пожалуйста, вставьте свой журнал rails, чтобы узнать, действительно ли существует
ROLLBACK
.2. github.com/rails/rails/issues/36965 кажется, это известная проблема
3. @max да, и когда он отключается, он должен вызвать откат. Поэтому при создании / обновлении / удалении он всегда должен вызывать after_commit или after_rollback .
Ответ №1:
Транзакции БД по умолчанию открываются только после успешной проверки объекта, который нужно сохранить, если вы не откроете их вручную. Попробуйте
User.transaction do
User.first.update!(name: nil)
end