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

Reset named scope cache whenever the @target is reset

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