123456789_123456789_123456789_123456789_123456789_

Module: ActiveRecord::Explain

Relationships & Source Files
Extension / Inclusion / Inheritance Descendants
Extended In:
Included In:
Defined in: activerecord/lib/active_record/explain.rb

Instance Method Summary

Instance Method Details

#build_explain_clause(options = []) (private)

[ GitHub ]

  
# File 'activerecord/lib/active_record/explain.rb', line 54

def build_explain_clause(options = [])
  if connection.respond_to?(:build_explain_clause, true)
    connection.build_explain_clause(options)
  else
    "EXPLAIN for:"
  end
end

#collecting_queries_for_explain

This method is for internal use only.

Executes the block with the collect flag enabled. Queries are collected asynchronously by the subscriber and returned.

[ GitHub ]

  
# File 'activerecord/lib/active_record/explain.rb', line 9

def collecting_queries_for_explain # :nodoc:
  ExplainRegistry.collect = true
  yield
  ExplainRegistry.queries
ensure
  ExplainRegistry.reset
end

#connection_explain(sql, binds, options) (private)

[ GitHub ]

  
# File 'activerecord/lib/active_record/explain.rb', line 62

def connection_explain(sql, binds, options)
  if connection.method(:explain).parameters.size == 2
    ActiveRecord.deprecator.warn(<<~MSG.squish)
      The current database adapter, #{connection.adapter_name}, does not support explain options.
      To remove this warning, the adapter must implement `build_explain_clause(options = [])`.
    MSG
    connection.explain(sql, binds)
  else
    connection.explain(sql, binds, options)
  end
end

#exec_explain(queries, options = [])

This method is for internal use only.

Makes the adapter execute EXPLAIN for the tuples of queries and bindings. Returns a formatted string ready to be logged.

[ GitHub ]

  
# File 'activerecord/lib/active_record/explain.rb', line 19

def exec_explain(queries, options = []) # :nodoc:
  str = queries.map do |sql, binds|
    msg = +"#{build_explain_clause(options)} #{sql}"
    unless binds.empty?
      msg << " "
      msg << binds.map { |attr| render_bind(attr) }.inspect
    end
    msg << "\n"
    msg << connection_explain(sql, binds, options)
  end.join("\n")

  # Overriding inspect to be more human readable, especially in the console.
  def str.inspect
    self
  end

  str
end

#render_bind(attr) (private)

[ GitHub ]

  
# File 'activerecord/lib/active_record/explain.rb', line 39

def render_bind(attr)
  if ActiveModel::Attribute === attr
    value = if attr.type.binary? && attr.value
      "<#{attr.value_for_database.to_s.bytesize} bytes of binary data>"
    else
      connection.type_cast(attr.value_for_database)
    end
  else
    value = connection.type_cast(attr)
    attr  = nil
  end

  [attr&.name, value]
end