Skip to content

Instantly share code, notes, and snippets.

@sshaw
Last active June 27, 2016 01:14
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save sshaw/05d8bdf99e4175816db858323fb2169c to your computer and use it in GitHub Desktop.
Save sshaw/05d8bdf99e4175816db858323fb2169c to your computer and use it in GitHub Desktop.
Make debugging a bit easier by determining the source of ActiveRecord queries. The source of queries will be output via logger.debug().
#
# Make debugging a bit easier by determining the source of ActiveRecord queries.
# The source of queries will be output via logger.debug().
#
# By: Skye Shaw (https://github.com/sshaw)
# Date: 2014-10-24
# Source: https://gist.github.com/sshaw/05d8bdf99e4175816db858323fb2169c
#
# === Usage
#
# # ActiveSupport::BacktraceCleaner
# QuerySource::STACK_CLEANER.add_silencer { |line| line =~ /foo/ }
#
# # Trace all User queries
# User.extend QuerySource
#
# # Trace all ActiveRecord queries
# ActiveRecord::Base.extend QuerySource
#
module QuerySource
START_TRACE_MARKER = " Begin Query Trace ".center(50, "=").freeze
END_TRACE_MARKER = " End Query Trace ".center(50, "=").freeze
STACK_CLEANER = if defined?(Rails)
Rails.backtrace_cleaner
else
require "active_support/backtrace_cleaner"
cleaner = ActiveSupport::BacktraceCleaner.new
cleaner.add_silencer { |line| line =~ %r(/gems/) }
end
def find_by_sql(req, sql)
return super unless logger.debug?
trace = STACK_CLEANER.clean(caller)
return super unless trace.any?
logger.debug(START_TRACE_MARKER)
result = super
logger.debug(trace.join("\n"))
logger.debug(END_TRACE_MARKER)
result
end
end
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment