1
0
Fork 0
mirror of https://github.com/rails/rails.git synced 2022-11-09 12:12:34 -05:00

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.

This commit is contained in:
Jon Leighton 2011-07-07 01:07:20 +01:00
parent 7da88c5b29
commit 86390c3bf3
2 changed files with 11 additions and 7 deletions

View file

@ -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)

View file

@ -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