aboutsummaryrefslogtreecommitdiffstats
path: root/activerecord/lib/active_record/observer.rb
diff options
context:
space:
mode:
authorKamal Fariz Mahyuddin <kamal.fariz@gmail.com>2011-02-09 23:37:30 +0800
committerAaron Patterson <aaron.patterson@gmail.com>2011-02-22 16:25:19 -0800
commit6ba8caf3ee239fd7010b18ff251cb5c2d52b48c4 (patch)
tree1ca8bb6d5feffbb24fabb64b6c552b1dc3e98b53 /activerecord/lib/active_record/observer.rb
parent3265bbb65998d8175f3cd087f355a007bf4d2d47 (diff)
downloadrails-6ba8caf3ee239fd7010b18ff251cb5c2d52b48c4.tar.gz
rails-6ba8caf3ee239fd7010b18ff251cb5c2d52b48c4.tar.bz2
rails-6ba8caf3ee239fd7010b18ff251cb5c2d52b48c4.zip
Fix observer callbacks firing multiple times on descendant instances
Diffstat (limited to 'activerecord/lib/active_record/observer.rb')
-rw-r--r--activerecord/lib/active_record/observer.rb9
1 files changed, 8 insertions, 1 deletions
diff --git a/activerecord/lib/active_record/observer.rb b/activerecord/lib/active_record/observer.rb
index 8b011ad9af..0893d7e337 100644
--- a/activerecord/lib/active_record/observer.rb
+++ b/activerecord/lib/active_record/observer.rb
@@ -104,10 +104,17 @@ module ActiveRecord
def define_callbacks(klass)
observer = self
+ observer_name = observer.class.name.underscore.gsub('/', '__')
ActiveRecord::Callbacks::CALLBACKS.each do |callback|
next unless respond_to?(callback)
- klass.send(callback){|record| observer.send(callback, record)}
+ callback_meth = :"_notify_#{observer_name}_for_#{callback}"
+ unless klass.respond_to?(callback_meth)
+ klass.send(:define_method, callback_meth) do
+ observer.send(callback, self)
+ end
+ klass.send(callback, callback_meth)
+ end
end
end
end