Skip to content

Instantly share code, notes, and snippets.

@phiggins
Last active October 12, 2015 14:57
Show Gist options
  • Save phiggins/4044071 to your computer and use it in GitHub Desktop.
Save phiggins/4044071 to your computer and use it in GitHub Desktop.
Measure ActiveRecord queries executed in a block
Organization.where("name != 'national'")
email = "[email protected]"
User.where(email: email).destroy_all
def sql_queries(title, verbose=false)
queries = Hash.new(0)
callback = lambda {|*args|
sql = args.last[:sql]
next if sql =~ /^SHOW|^COMMIT|^BEGIN/
case sql
when /^SELECT/ then queries[:select] += 1
when /^INSERT/ then queries[:insert] += 1
when /^UPDATE/ then queries[:update] += 1
when /^DELETE/ then queries[:delete] += 1
else ; puts sql
end
queries[:total] += 1
}
puts "SQL Queries for '#{title}'"
if verbose
old_logger = ActiveRecord::Base.logger
ActiveRecord::Base.logger = Logger.new($stdout)
end
ActiveSupport::Notifications.subscribed(callback, "sql.active_record") do
yield
end
p queries
ensure
if verbose
ActiveRecord::Base.logger = old_logger
end
end
user = nil
sql_queries("create") do
user = User.create!(
first_name: 'lol', email: email, password: 'testtest',
password_confirmation: 'testtest', last_name: 'lol')
end
sql_queries("save") do
user.sign_in_count = 1337
user.save!
end
@phiggins
Copy link
Author

phiggins commented Apr 8, 2013

$ rails r sql_test.rb
SQL Queries for 'create'
{:select=>21, :total=>28, :insert=>6, :update=>1}
SQL Queries for 'save'
{:select=>4, :total=>6, :update=>2}

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment