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
- #build_explain_clause(options = []) private
- #connection_explain(sql, binds, options) private
- #render_bind(attr) private
-
#collecting_queries_for_explain
Internal use only
Executes the block with the collect flag enabled.
-
#exec_explain(queries, options = [])
Internal use only
Makes the adapter execute EXPLAIN for the tuples of queries and bindings.
Instance Method Details
#build_explain_clause(options = []) (private)
[ GitHub ]# File 'activerecord/lib/active_record/explain.rb', line 54
def build_explain_clause( = []) if connection.respond_to?(:build_explain_clause, true) connection.build_explain_clause( ) 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.
# 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, ) 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, ) 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.
# File 'activerecord/lib/active_record/explain.rb', line 19
def exec_explain(queries, = []) # :nodoc: str = queries.map do |sql, binds| msg = +"#{build_explain_clause( )} #{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
#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