mirror of
https://github.com/rails/rails.git
synced 2022-11-09 12:12:34 -05:00
Removing the scope-caching which happens on association proxies, because the query is already cached by the query cacher. For formalised proof see http://www.youtube.com/watch?v=wDefXLb-FDs
This commit is contained in:
parent
a616e7a88c
commit
fc9a04b6a6
3 changed files with 15 additions and 24 deletions
|
@ -21,14 +21,7 @@ module ActiveRecord
|
|||
attr_reader :proxy
|
||||
|
||||
def initialize(owner, reflection)
|
||||
# When scopes are created via method_missing on the proxy, they are stored so that
|
||||
# any records fetched from the database are kept around for future use.
|
||||
@scopes_cache = Hash.new do |hash, method|
|
||||
hash[method] = { }
|
||||
end
|
||||
|
||||
super
|
||||
|
||||
@proxy = CollectionProxy.new(self)
|
||||
end
|
||||
|
||||
|
@ -74,7 +67,6 @@ module ActiveRecord
|
|||
def reset
|
||||
@loaded = false
|
||||
@target = []
|
||||
@scopes_cache.clear
|
||||
end
|
||||
|
||||
def select(select = nil)
|
||||
|
@ -327,10 +319,6 @@ module ActiveRecord
|
|||
end
|
||||
end
|
||||
|
||||
def cached_scope(method, args)
|
||||
@scopes_cache[method][args] ||= scoped.readonly(nil).send(method, *args)
|
||||
end
|
||||
|
||||
def load_target
|
||||
if find_target?
|
||||
targets = []
|
||||
|
|
|
@ -82,8 +82,6 @@ module ActiveRecord
|
|||
end
|
||||
end
|
||||
|
||||
elsif @association.klass.scopes[method]
|
||||
@association.cached_scope(method, args)
|
||||
else
|
||||
scoped.readonly(nil).send(method, *args, &block)
|
||||
end
|
||||
|
|
|
@ -440,26 +440,31 @@ class NamedScopeTest < ActiveRecord::TestCase
|
|||
end
|
||||
end
|
||||
|
||||
# Note: these next two are kinda odd because they are essentially just testing that the
|
||||
# query cache works as it should, but they are here for legacy reasons as they was previously
|
||||
# a separate cache on association proxies, and these show that that is not necessary.
|
||||
def test_scopes_are_cached_on_associations
|
||||
post = posts(:welcome)
|
||||
|
||||
assert_equal post.comments.containing_the_letter_e.object_id, post.comments.containing_the_letter_e.object_id
|
||||
|
||||
post.comments.containing_the_letter_e.all # force load
|
||||
assert_no_queries { post.comments.containing_the_letter_e.all }
|
||||
Post.cache do
|
||||
assert_queries(1) { post.comments.containing_the_letter_e.all }
|
||||
assert_no_queries { post.comments.containing_the_letter_e.all }
|
||||
end
|
||||
end
|
||||
|
||||
def test_scopes_with_arguments_are_cached_on_associations
|
||||
post = posts(:welcome)
|
||||
|
||||
one = post.comments.limit_by(1).all
|
||||
assert_equal 1, one.size
|
||||
Post.cache do
|
||||
one = assert_queries(1) { post.comments.limit_by(1).all }
|
||||
assert_equal 1, one.size
|
||||
|
||||
two = post.comments.limit_by(2).all
|
||||
assert_equal 2, two.size
|
||||
two = assert_queries(1) { post.comments.limit_by(2).all }
|
||||
assert_equal 2, two.size
|
||||
|
||||
assert_no_queries { post.comments.limit_by(1).all }
|
||||
assert_no_queries { post.comments.limit_by(2).all }
|
||||
assert_no_queries { post.comments.limit_by(1).all }
|
||||
assert_no_queries { post.comments.limit_by(2).all }
|
||||
end
|
||||
end
|
||||
|
||||
def test_scopes_are_reset_on_association_reload
|
||||
|
|
Loading…
Reference in a new issue