diff options
author | Jon Leighton <j@jonathanleighton.com> | 2011-07-07 01:07:20 +0100 |
---|---|---|
committer | Jon Leighton <j@jonathanleighton.com> | 2011-07-07 01:07:31 +0100 |
commit | 86390c3bf30dd61f3bac047e0887b74ff422c02f (patch) | |
tree | e4a980c2bd2fb2c6f03707904c0636bfed6e9b08 | |
parent | 7da88c5b297486cd90696133d287be7d60d65218 (diff) | |
download | rails-86390c3bf30dd61f3bac047e0887b74ff422c02f.tar.gz rails-86390c3bf30dd61f3bac047e0887b74ff422c02f.tar.bz2 rails-86390c3bf30dd61f3bac047e0887b74ff422c02f.zip |
Don't construct association scope in initializer. This yields a big performance gain for cases where the association is never used to load the target, for example with preloading. Related: #1873.
-rw-r--r-- | activerecord/lib/active_record/associations/association.rb | 16 | ||||
-rw-r--r-- | activerecord/lib/active_record/autosave_association.rb | 2 |
2 files changed, 11 insertions, 7 deletions
diff --git a/activerecord/lib/active_record/associations/association.rb b/activerecord/lib/active_record/associations/association.rb index daadc8aa81..bb519c5703 100644 --- a/activerecord/lib/active_record/associations/association.rb +++ b/activerecord/lib/active_record/associations/association.rb @@ -30,7 +30,7 @@ module ActiveRecord @updated = false reset - construct_scope + reset_scope end # Returns the name of the table of the related class: @@ -51,7 +51,7 @@ module ActiveRecord # Reloads the \target and returns +self+ on success. def reload reset - construct_scope + reset_scope load_target self unless target.nil? end @@ -84,21 +84,25 @@ module ActiveRecord end def scoped - target_scope.merge(@association_scope) + target_scope.merge(association_scope) end - # Construct the scope for this association. + # The scope for this association. # # Note that the association_scope is merged into the target_scope only when the # scoped method is called. This is because at that point the call may be surrounded # by scope.scoping { ... } or with_scope { ... } etc, which affects the scope which # actually gets built. - def construct_scope + def association_scope if klass - @association_scope = AssociationScope.new(self).scope + @association_scope ||= AssociationScope.new(self).scope end end + def reset_scope + @association_scope = nil + end + # Set the inverse association, if possible def set_inverse_instance(record) if record && invertible_for?(record) diff --git a/activerecord/lib/active_record/autosave_association.rb b/activerecord/lib/active_record/autosave_association.rb index 036d514a03..085fdba639 100644 --- a/activerecord/lib/active_record/autosave_association.rb +++ b/activerecord/lib/active_record/autosave_association.rb @@ -347,7 +347,7 @@ module ActiveRecord end # reconstruct the scope now that we know the owner's id - association.send(:construct_scope) if association.respond_to?(:construct_scope) + association.send(:reset_scope) if association.respond_to?(:reset_scope) end end |