From e8f0b1ddd97cfcefc32554a1a9447ec092c4d0ae Mon Sep 17 00:00:00 2001 From: Rick Olson Date: Sun, 6 Aug 2006 02:08:29 +0000 Subject: Refactor ActiveRecord::Base.reset_subclasses to #reset, and add global observer resetting. [Rick Olson] git-svn-id: http://svn-commit.rubyonrails.org/rails/trunk@4683 5ecf4fe2-1ee6-0310-87b1-e25e094e27de --- activerecord/CHANGELOG | 2 ++ activerecord/lib/active_record/base.rb | 4 ++++ activerecord/lib/active_record/observer.rb | 18 ++++++++++++++++-- 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) -- cgit v1.2.3