purpose of ActiveRecord::Base.reset_subclasses?

ActionController::Dispatcher#cleanup_application does this:

    def cleanup_application(force = false)       if Dependencies.load? || force         ActiveRecord::Base.reset_subclasses if defined?(ActiveRecord)         Dependencies.clear         ActiveRecord::Base.clear_reloadable_connections! if defined?(ActiveRecord)       end     end

where

    def self.reset_subclasses #:nodoc:       nonreloadables =       subclasses.each do |klass|         unless Dependencies.autoloaded? klass           nonreloadables << klass           next         end         klass.instance_variables.each { |var| klass.send(:remove_instance_variable, var) }         klass.instance_methods(false).each { |m| klass.send :undef_method, m }       end       @@subclasses = {}       nonreloadables.each { |klass| (@@subclasses[klass.superclass]

= ) << klass }

    end

Why do ARs need that cleanup?

-- fxn

Probably because they have to reload the database schema which is partly described in their class instance variables on every request.

For example, columns:

      # Returns an array of column objects for the table associated with this class.       def columns         unless @columns           @columns = connection.columns(table_name, "#{name} Columns")           @columns.each {|column| column.primary = column.name == primary_key}         end         @columns       end

But if the class was autoloaded wouldn't that be a side-effect of remove_const Model + const_missing Model as with the rest of autoloaded classes? Why are those special removals needed?

-- fxn

But if the class was autoloaded wouldn't that be a side-effect of remove_const Model + const_missing Model as with the rest of autoloaded classes? Why are those special removals needed?

Indeed that does seem unneeded at first glance. Another thing to test out once 2.0 is out the door I guess :wink: