aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--activerecord/CHANGELOG2
-rwxr-xr-xactiverecord/lib/active_record/base.rb4
-rw-r--r--activerecord/lib/active_record/observer.rb18
3 files changed, 22 insertions, 2 deletions
diff --git a/activerecord/CHANGELOG b/activerecord/CHANGELOG
index 33a874f5b8..9b69dce47c 100644
--- a/activerecord/CHANGELOG
+++ b/activerecord/CHANGELOG
@@ -1,5 +1,7 @@
*SVN*
+* Refactor ActiveRecord::Base.reset_subclasses to #reset, and add global observer resetting. [Rick Olson]
+
* Formally deprecate the deprecated finders. [Koz]
* Formally deprecate rich associations. [Koz]
diff --git a/activerecord/lib/active_record/base.rb b/activerecord/lib/active_record/base.rb
index 1d9f0175bd..5e9d18e5d4 100755
--- a/activerecord/lib/active_record/base.rb
+++ b/activerecord/lib/active_record/base.rb
@@ -272,6 +272,10 @@ module ActiveRecord #:nodoc:
super
end
+ def self.reset
+ reset_subclasses
+ end
+
def self.reset_subclasses #:nodoc:
nonreloadables = []
subclasses.each do |klass|
diff --git a/activerecord/lib/active_record/observer.rb b/activerecord/lib/active_record/observer.rb
index a2030b84b3..262f12d91e 100644
--- a/activerecord/lib/active_record/observer.rb
+++ b/activerecord/lib/active_record/observer.rb
@@ -4,10 +4,18 @@ require 'set'
module ActiveRecord
module Observing # :nodoc:
def self.included(base)
- base.extend(ClassMethods)
+ class << base
+ include ClassMethods
+ alias_method_chain :reset, :observers
+ end
end
module ClassMethods
+ def reset_with_observers # :nodoc:
+ reset_without_observers
+ instantiate_observers
+ end
+
# Activates the observers assigned. Examples:
#
# # Calls PersonObserver.instance
@@ -19,7 +27,13 @@ module ActiveRecord
# # Same as above, just using explicit class references
# ActiveRecord::Base.observers = Cacher, GarbageCollector
def observers=(*observers)
- observers.flatten.each do |observer|
+ @observers = observers.flatten
+ end
+
+ # Instantiate the global ActiveRecord observers
+ def instantiate_observers
+ return if @observers.blank?
+ @observers.each do |observer|
if observer.respond_to?(:to_sym) # Symbol or String
observer.to_s.camelize.constantize.instance
elsif observer.respond_to?(:instance)