class N1Finder::Adapters::ActiveRecordAdapter
Catches queries when using ActiveRecord
Constants
- MAIN_METHOD
Method in `database_class` that we observe to find N+1 queries
Any activerecord connection adapter has a `exec_query` method http://api.rubyonrails.org/classes/ActiveRecord/Result.html
Private Class Methods
find_sql_params(params)
click to toggle source
Searches for activerecord sql params in array
@param [Array] params
@return [Hash] sql params
# File lib/n_1_finder/adapters/active_record_adapter.rb, line 38 def find_sql_params(params) binds = params.find do |param| param.is_a?(Array) && param.first.is_a?(Array) && param.first.first.is_a?(ActiveRecord::ConnectionAdapters::Column) end || [] Hash[binds].each_with_object({}) do |(key, value), object| object[key.name] = value end end
Private Instance Methods
database_class()
click to toggle source
# File lib/n_1_finder/adapters/active_record_adapter.rb, line 28 def database_class @database_class ||= ActiveRecord::Base.connection.class end
set_trap()
click to toggle source
# File lib/n_1_finder/adapters/active_record_adapter.rb, line 12 def set_trap main_method = MAIN_METHOD main_method_alias = MAIN_METHOD_ALIAS current_storage = storage database_class.class_eval do alias_method main_method_alias, main_method define_method(main_method) do |*params, &block| sql = params.first sql_params = N1Finder::Adapters::ActiveRecordAdapter.find_sql_params(params) current_storage.add(sql, sql_params, caller) send(main_method_alias, *params, &block) end end end