модуль ActiveRecord::ConnectionAdapters::QueryCache
Атрибуты
query_cache[R]
query_cache_enabled[R]
Публичные методы класса
# File activerecord/lib/active_record/connection_adapters/abstract/query_cache.rb, line 17
def dirties_query_cache(base, *method_names)
method_names.each do |method_name|
base.class_eval <<-end_code, __FILE__, __LINE__ + 1
def #{method_name}(*)
ActiveRecord::Base.clear_query_caches_for_current_thread
super
end
end_code
end
end # File activerecord/lib/active_record/connection_adapters/abstract/query_cache.rb, line 52
def initialize(*)
super
@query_cache = Hash.new { |h, sql| h[sql] = {} }
@query_cache_enabled = false
end Вызывает метод суперкласса
Публичные методы экземпляра
# File activerecord/lib/active_record/connection_adapters/abstract/query_cache.rb, line 59 def cache old, @query_cache_enabled = @query_cache_enabled, true yield ensure @query_cache_enabled = old clear_query_cache unless @query_cache_enabled end
Включить кэш запросов в блоке.
# File activerecord/lib/active_record/connection_adapters/abstract/query_cache.rb, line 90
def clear_query_cache
@lock.synchronize do
@query_cache.clear
end
end Очищает кэш запросов.
Одна из причин, по которой вы можете явно вызвать этот метод, заключается в выполнении запросов, которые запрашивают у базы данных рандомизацию результатов. В противном случае кэш будет видеть тот же SQL-запрос и повторять возвращение того же результата каждый раз, незаметно подрывая ожидаемую рандомизацию.
# File activerecord/lib/active_record/connection_adapters/abstract/query_cache.rb, line 71 def disable_query_cache! @query_cache_enabled = false clear_query_cache end
# File activerecord/lib/active_record/connection_adapters/abstract/query_cache.rb, line 67 def enable_query_cache! @query_cache_enabled = true end
# File activerecord/lib/active_record/connection_adapters/abstract/query_cache.rb, line 96
def select_all(arel, name = nil, binds = [], preparable: nil, async: false)
arel = arel_from_relation(arel)
# If arel is locked this is a SELECT ... FOR UPDATE or somesuch.
# Such queries should not be cached.
if @query_cache_enabled && !(arel.respond_to?(:locked) && arel.locked)
sql, binds, preparable = to_sql_and_binds(arel, binds, preparable)
if async
lookup_sql_cache(sql, name, binds) || super(sql, name, binds, preparable: preparable, async: async)
else
cache_sql(sql, name, binds) { super(sql, name, binds, preparable: preparable, async: async) }
end
else
super
end
end Вызывает метод суперкласса
# File activerecord/lib/active_record/connection_adapters/abstract/query_cache.rb, line 77 def uncached old, @query_cache_enabled = @query_cache_enabled, false yield ensure @query_cache_enabled = old end
Отключить кэш запросов в блоке.
© 2004–2021 David Heinemeier Hansson
Licensed under the MIT License.