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:
parent
7da88c5b29
commit
86390c3bf3
2 changed files with 11 additions and 7 deletions
|
@ -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)
|
||||
|
|
|
@ -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
|
||||
|
||||
|
|
Loading…
Reference in a new issue