diff options
-rw-r--r-- | activerecord/CHANGELOG | 13 | ||||
-rwxr-xr-x | activerecord/lib/active_record/associations.rb | 29 | ||||
-rw-r--r-- | railties/CHANGELOG | 2 | ||||
-rw-r--r-- | railties/lib/dispatcher.rb | 2 |
4 files changed, 43 insertions, 3 deletions
diff --git a/activerecord/CHANGELOG b/activerecord/CHANGELOG index b8e3e0f4ba..c642369bec 100644 --- a/activerecord/CHANGELOG +++ b/activerecord/CHANGELOG @@ -1,5 +1,18 @@ *SVN* +* Added a require_association hook on const_missing that makes it possible to use any model class without requiring it first. This makes STI look like: + + before: + require_association 'person' + class Employee < Person + end + + after: + class Employee < Person + end + + This also reduces the usefulness of Controller.model in Action Pack to currently only being for documentation purposes. + * Added that Base.update_all and Base.delete_all return an integer of the number of affected rows #341 * Changed the interface on AbstractAdapter to require that adapters return the number of affected rows on delete and update operations. diff --git a/activerecord/lib/active_record/associations.rb b/activerecord/lib/active_record/associations.rb index ba7f34d729..a66a6c9a5c 100755 --- a/activerecord/lib/active_record/associations.rb +++ b/activerecord/lib/active_record/associations.rb @@ -3,8 +3,28 @@ require 'active_record/associations/has_many_association' require 'active_record/associations/has_and_belongs_to_many_association' require 'active_record/deprecated_associations' -unless Object.respond_to?(:require_association) - Object.send(:define_method, :require_association) { |file_name| ActiveRecord::Base.require_association(file_name) } + +class << Object #:nodoc: + # Make require_association available as a bare method. + unless respond_to?(:require_association) + def require_association(file_name) + ActiveRecord::Base.require_association(file_name) + end + end + + # Use const_missing to autoload associations so we don't have to + # require_association when using single-table inheritance. + unless respond_to?(:pre_association_const_missing) + alias_method :pre_association_const_missing, :const_missing + + def const_missing(class_id) + begin + require_association(Inflect.underscore(Inflector.demodulize(class_id.to_s))) + rescue LoadError + pre_association_const_missing(class_id) + end + end + end end module ActiveRecord @@ -464,6 +484,11 @@ module ActiveRecord def reset_associations_loaded self.associations_loaded = [] end + + # Reload all the associations that have already been loaded once. + def reload_associations_loaded + associations_loaded.each { |file_name| silence_warnings { load("#{file_name}.rb") } } + end private # Raises an exception if an invalid option has been specified to prevent misspellings from slipping through diff --git a/railties/CHANGELOG b/railties/CHANGELOG index 003ac065ac..a0e402e5e1 100644 --- a/railties/CHANGELOG +++ b/railties/CHANGELOG @@ -1,5 +1,7 @@ *SVN* +* Added that Active Record associations are now reloaded instead of cleared to work with the new const_missing hook in Active Record. + * Added graceful handling of an inaccessible log file by redirecting output to STDERR with a warning #330 [rainmkr] * Added support for a -h/--help parameter in the generator #331 [Ulysses] diff --git a/railties/lib/dispatcher.rb b/railties/lib/dispatcher.rb index e3fd36d89a..0fcd295094 100644 --- a/railties/lib/dispatcher.rb +++ b/railties/lib/dispatcher.rb @@ -43,7 +43,7 @@ class Dispatcher if ActionController::Base.reload_dependencies Object.send(:remove_const, "ApplicationController") if Object.const_defined?(:ApplicationController) Object.send(:remove_const, controller_class_name(controller_name)) if Object.const_defined?(controller_class_name(controller_name)) - ActiveRecord::Base.reset_associations_loaded + ActiveRecord::Base.reload_associations_loaded ActiveRecord::Base.reset_column_information_and_inheritable_attributes_for_all_subclasses end |