提交 fce3dbf3 编写于 作者: J James Coleman

Don't bust AR query cache when types are not same object

AR's query cache currently depends on the type objects being not only
equivalent but also to be the same object. Either reloading the type
information or using custom type objects that aren't cached will
unnecessarily bust the cache.

This is fixed in 5.0 as an ancillary part of 574f2556
but here I also add a test for the condition.
上级 2509b240
* Fix query caching when type information is reset
Backports ancillary fix in 5.0.
*James Coleman*
* Allow `joins` to be unscoped.
Fixes #13775.
......
......@@ -86,6 +86,11 @@ def ==(other)
scale == other.scale &&
limit == other.limit
end
alias eql? ==
def hash
[self.class, precision, scale, limit].hash
end
private
......
......@@ -243,6 +243,26 @@ def test_query_cache_doesnt_leak_cached_results_of_rolled_back_queries
assert_equal 0, Post.where(title: 'rollback').to_a.count
end
end
def test_query_cached_even_when_types_are_reset
Task.cache do
# Warm the cache
task = Task.find(1)
Task.connection.type_map.clear
# Preload the type cache again (so we don't have those queries issued during our assertions)
Task.connection.send(:initialize_type_map, Task.connection.type_map)
# Clear places where type information is cached
Task.reset_column_information
Task.find_by_statement_cache.clear
assert_queries(0) do
Task.find(1)
end
end
end
end
class QueryCacheExpiryTest < ActiveRecord::TestCase
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册