提交 48634bf5 编写于 作者: P Pratik Naik

Reset named scope cache whenever the @target is reset

上级 eb063538
......@@ -105,6 +105,7 @@ def to_ary
def reset
reset_target!
reset_named_scopes_cache!
@loaded = false
end
......@@ -162,6 +163,7 @@ def delete_all
load_target
delete(@target)
reset_target!
reset_named_scopes_cache!
end
# Calculate sum using SQL, not Enumerable
......@@ -250,6 +252,7 @@ def destroy_all
load_target
destroy(@target)
reset_target!
reset_named_scopes_cache!
end
def create(attrs = {})
......@@ -406,8 +409,8 @@ def method_missing(method, *args)
super
end
elsif @reflection.klass.scopes[method]
@_scopes ||= {}
@_scopes[method] ||= with_scope(construct_scope) { @reflection.klass.send(method, *args) }
@_named_scopes_cache ||= {}
@_named_scopes_cache[method] ||= with_scope(construct_scope) { @reflection.klass.send(method, *args) }
else
with_scope(construct_scope) do
if block_given?
......@@ -428,6 +431,10 @@ def reset_target!
@target = Array.new
end
def reset_named_scopes_cache!
@_named_scopes_cache = {}
end
def find_target
records =
if @reflection.options[:finder_sql]
......
......@@ -422,6 +422,16 @@ def test_named_scopes_are_cached_on_associations
post.comments.containing_the_letter_e.all # force load
assert_no_queries { post.comments.containing_the_letter_e.all }
end
def test_named_scopes_are_reset_on_association_reload
post = posts(:welcome)
[:destroy_all, :reset, :delete_all].each do |method|
before = post.comments.containing_the_letter_e
post.comments.send(method)
assert before.object_id != post.comments.containing_the_letter_e.object_id, "AssociationCollection##{method} should reset the named scopes cache"
end
end
end
class DynamicScopeMatchTest < ActiveRecord::TestCase
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册