module ActiveRecord::ConnectionAdapters::QueryCache

Attributes

query_cache[RW]

Public Class Methods

dirties_query_cache(base, *method_names) click to toggle source
# File lib/active_record/connection_adapters/abstract/query_cache.rb, line 20
        def dirties_query_cache(base, *method_names)
          method_names.each do |method_name|
            base.class_eval <<-end_code, __FILE__, __LINE__ + 1
              def #{method_name}(...)
                if pool.dirties_query_cache
                  ActiveRecord::Base.clear_query_caches_for_current_thread
                end
                super
              end
            end_code
          end
        end
new(*) click to toggle source
Calls superclass method
# File lib/active_record/connection_adapters/abstract/query_cache.rb, line 196
def initialize(*)
  super
  @query_cache = nil
end

Public Instance Methods

cache(&block) click to toggle source

Enable the query cache within the block.

# File lib/active_record/connection_adapters/abstract/query_cache.rb, line 206
def cache(&block)
  pool.enable_query_cache(&block)
end
clear_query_cache() click to toggle source

Clears the query cache.

One reason you may wish to call this method explicitly is between queries that ask the database to randomize results. Otherwise the cache would see the same SQL query and repeatedly return the same result each time, silently undermining the randomness you were expecting.

# File lib/active_record/connection_adapters/abstract/query_cache.rb, line 232
def clear_query_cache
  pool.clear_query_cache
end
disable_query_cache!() click to toggle source
# File lib/active_record/connection_adapters/abstract/query_cache.rb, line 222
def disable_query_cache!
  pool.disable_query_cache!
end
enable_query_cache!() click to toggle source
# File lib/active_record/connection_adapters/abstract/query_cache.rb, line 210
def enable_query_cache!
  pool.enable_query_cache!
end
query_cache_enabled() click to toggle source
# File lib/active_record/connection_adapters/abstract/query_cache.rb, line 201
def query_cache_enabled
  @query_cache&.enabled?
end
uncached(dirties: true, &block) click to toggle source

Disable the query cache within the block.

Set dirties: false to prevent query caches on all connections from being cleared by write operations. (By default, write operations dirty all connections’ query caches in case they are replicas whose cache would now be outdated.)

# File lib/active_record/connection_adapters/abstract/query_cache.rb, line 218
def uncached(dirties: true, &block)
  pool.disable_query_cache(dirties: dirties, &block)
end

Private Instance Methods

cache_notification_info(sql, name, binds) click to toggle source

Database adapters can override this method to provide custom cache information.

# File lib/active_record/connection_adapters/abstract/query_cache.rb, line 308
def cache_notification_info(sql, name, binds)
  {
    sql: sql,
    binds: binds,
    type_casted_binds: -> { type_casted_binds(binds) },
    name: name,
    connection: self,
    transaction: current_transaction.user_transaction.presence,
    cached: true
  }
end
cache_notification_info_result(sql, name, binds, result) click to toggle source
# File lib/active_record/connection_adapters/abstract/query_cache.rb, line 300
def cache_notification_info_result(sql, name, binds, result)
  payload = cache_notification_info(sql, name, binds)
  payload[:row_count] = result.length
  payload
end
cache_sql(sql, name, binds) { || ... } click to toggle source
# File lib/active_record/connection_adapters/abstract/query_cache.rb, line 278
def cache_sql(sql, name, binds)
  key = binds.empty? ? sql : [sql, binds]
  result = nil
  hit = true

  @lock.synchronize do
    result = @query_cache.compute_if_absent(key) do
      hit = false
      yield
    end
  end

  if hit
    ActiveSupport::Notifications.instrument(
      "sql.active_record",
      cache_notification_info_result(sql, name, binds, result)
    )
  end

  result.dup
end
lookup_sql_cache(sql, name, binds) click to toggle source
# File lib/active_record/connection_adapters/abstract/query_cache.rb, line 260
def lookup_sql_cache(sql, name, binds)
  key = binds.empty? ? sql : [sql, binds]

  result = nil
  @lock.synchronize do
    result = @query_cache[key]
  end

  if result
    ActiveSupport::Notifications.instrument(
      "sql.active_record",
      cache_notification_info_result(sql, name, binds, result)
    )
  end

  result
end
unset_query_cache!() click to toggle source
# File lib/active_record/connection_adapters/abstract/query_cache.rb, line 256
def unset_query_cache!
  @query_cache = nil
end