Не сработал обратный вызов ActiveRecord after_rollback

#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