From 80b24083afc9c6739098007358a8883d317ee6fb Mon Sep 17 00:00:00 2001 From: Matthew Bass Date: Thu, 7 Nov 2019 11:25:26 -0500 Subject: [PATCH] Add after_*_commit callbacks to observers Rails 5 adds after_{create,update,delete}_commit callback aliases. This commit makes these callbacks available in observers. --- lib/rails/observers/activerecord/observer.rb | 8 +++++++- test/active_record_observer_test.rb | 15 +++++++++++++++ 2 files changed, 22 insertions(+), 1 deletion(-) create mode 100644 test/active_record_observer_test.rb diff --git a/lib/rails/observers/activerecord/observer.rb b/lib/rails/observers/activerecord/observer.rb index 5218008..dbec242 100644 --- a/lib/rails/observers/activerecord/observer.rb +++ b/lib/rails/observers/activerecord/observer.rb @@ -94,6 +94,12 @@ module ActiveRecord # class Observer < ActiveModel::Observer + CALLBACKS = ActiveRecord::Callbacks::CALLBACKS.dup + + if Rails.version >= '5' + CALLBACKS.push(:after_create_commit, :after_update_commit, :after_destroy_commit) + end + protected def observed_classes @@ -110,7 +116,7 @@ def define_callbacks(klass) observer = self observer_name = observer.class.name.underscore.gsub('/', '__') - ActiveRecord::Callbacks::CALLBACKS.each do |callback| + CALLBACKS.each do |callback| next unless respond_to?(callback) callback_meth = :"_notify_#{observer_name}_for_#{callback}" unless klass.respond_to?(callback_meth) diff --git a/test/active_record_observer_test.rb b/test/active_record_observer_test.rb new file mode 100644 index 0000000..7029aa8 --- /dev/null +++ b/test/active_record_observer_test.rb @@ -0,0 +1,15 @@ +require 'minitest/autorun' +require 'active_record' +require 'rails/version' +require 'rails/observers/active_model/observing' +require 'rails/observers/activerecord/observer' + +class ActiveRecordObservingTest < ActiveSupport::TestCase + def test_observers_have_correct_callbacks + expected_callbacks = ActiveRecord::Callbacks::CALLBACKS.dup + if Rails.version >= '5' + expected_callbacks.push(:after_create_commit, :after_update_commit, :after_destroy_commit) + end + assert_equal expected_callbacks, ActiveRecord::Observer::CALLBACKS + end +end