class NPlusOneControl::Executor::Collector
Subscribes to ActiveSupport notifications and collect matching queries.
Public Class Methods
new(pattern)
click to toggle source
# File lib/n_plus_one_control/executor.rb, line 9 def initialize(pattern) @pattern = pattern end
Public Instance Methods
call() { || ... }
click to toggle source
# File lib/n_plus_one_control/executor.rb, line 13 def call @queries = [] ActiveSupport::Notifications .subscribed(method(:callback), NPlusOneControl.event) do yield end @queries end
callback(_name, _start, _finish, _message_id, values)
click to toggle source
# File lib/n_plus_one_control/executor.rb, line 22 def callback(_name, _start, _finish, _message_id, values) # rubocop:disable Metrics/CyclomaticComplexity,Metrics/LineLength return if %w[CACHE SCHEMA].include? values[:name] return unless @pattern.nil? || (values[:sql] =~ @pattern) query = values[:sql] if NPlusOneControl.backtrace_cleaner && NPlusOneControl.verbose source = extract_query_source_location(caller) query = "#{query}\n ↳ #{source.join("\n")}" unless source.empty? end @queries << query end
Private Instance Methods
extract_query_source_location(locations)
click to toggle source
# File lib/n_plus_one_control/executor.rb, line 40 def extract_query_source_location(locations) NPlusOneControl.backtrace_cleaner.call(locations.lazy) .take(NPlusOneControl.backtrace_length).to_a end