aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--activerecord/CHANGELOG13
-rwxr-xr-xactiverecord/lib/active_record/associations.rb29
-rw-r--r--railties/CHANGELOG2
-rw-r--r--railties/lib/dispatcher.rb2
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