module ActiveRecord::Explain
def collecting_queries_for_explain # :nodoc:
asynchronously by the subscriber and returned.
Executes the block with the collect flag enabled. Queries are collected
def collecting_queries_for_explain # :nodoc: ExplainRegistry.collect = true yield ExplainRegistry.queries ensure ExplainRegistry.reset end
def exec_explain(queries) # :nodoc:
Returns a formatted string ready to be logged.
Makes the adapter execute EXPLAIN for the tuples of queries and bindings.
def exec_explain(queries) # :nodoc: str = queries.map do |sql, binds| msg = +"EXPLAIN for: #{sql}" unless binds.empty? msg << " " msg << binds.map { |attr| render_bind(attr) }.inspect end msg << "\n" msg << connection.explain(sql, binds) end.join("\n") # Overriding inspect to be more human readable, especially in the console. def str.inspect self end str end
def render_bind(attr)
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