aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--activerecord/CHANGELOG2
-rw-r--r--activerecord/lib/active_record/observer.rb4
-rwxr-xr-xactiverecord/test/lifecycle_test.rb8
3 files changed, 13 insertions, 1 deletions
diff --git a/activerecord/CHANGELOG b/activerecord/CHANGELOG
index ec101186ea..fc2447f172 100644
--- a/activerecord/CHANGELOG
+++ b/activerecord/CHANGELOG
@@ -1,5 +1,7 @@
*SVN*
+* Fixed that Observers didn't observe sub-classes #627 [Florian Weber]
+
* Fix eager loading error messages, allow :include to specify tables using strings or symbols. Closes #2222 [Marcel Molina]
* Added check for RAILS_CONNECTION_ADAPTERS on startup and only load the connection adapters specified within if its present (available in Rails through config.connection_adapters using the new config) #1958 [skae]
diff --git a/activerecord/lib/active_record/observer.rb b/activerecord/lib/active_record/observer.rb
index 74f76efe3f..36a9ec5d3a 100644
--- a/activerecord/lib/active_record/observer.rb
+++ b/activerecord/lib/active_record/observer.rb
@@ -58,7 +58,9 @@ module ActiveRecord
end
def initialize
- [ observed_class ].flatten.each do |klass|
+ observed_classes = [ observed_class ].flatten
+ observed_subclasses_class = observed_classes.collect {|c| c.send(:subclasses) }.flatten!
+ (observed_classes + observed_subclasses_class).each do |klass|
klass.add_observer(self)
klass.send(:define_method, :after_find) unless klass.respond_to?(:after_find)
end
diff --git a/activerecord/test/lifecycle_test.rb b/activerecord/test/lifecycle_test.rb
index 4f12a3161c..d6c017672d 100755
--- a/activerecord/test/lifecycle_test.rb
+++ b/activerecord/test/lifecycle_test.rb
@@ -5,6 +5,7 @@ require 'fixtures/reply'
class Topic; def after_find() end end
class Developer; def after_find() end end
+class SpecialDeveloper < Developer; end
class TopicManualObserver
include Singleton
@@ -105,4 +106,11 @@ class LifecycleTest < Test::Unit::TestCase
developer = Developer.find(1)
assert_equal multi_observer.record.name, developer.name
end
+
+ def test_observing_subclasses
+ multi_observer = MultiObserver.instance
+
+ developer = SpecialDeveloper.find(1)
+ assert_equal multi_observer.record.name, developer.name
+ end
end