1
0
Fork 0
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:
Jon Leighton 2011-03-28 22:36:29 +01:00 committed by Aaron Patterson
parent a616e7a88c
commit fc9a04b6a6
3 changed files with 15 additions and 24 deletions

View file

@ -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 = []

View file

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

View file

@ -440,27 +440,32 @@ 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
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
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
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 }
end
end
def test_scopes_are_reset_on_association_reload
post = posts(:welcome)