Jag tror att du svarade på din egen fråga genom att nämna assert_queries
, men här kommer:
Jag skulle rekommendera att ta en titt på koden bakom assert_queries
och använda det för att bygga din egen metod som du kan använda för att räkna frågor. Den huvudsakliga magin här är denna rad:
ActiveSupport::Notifications.subscribe('sql.active_record', SQLCounter.new)
Jag pysslade lite i morse och slet ut de delar av ActiveRecord som gör frågeräkningen och kom fram till detta:
module ActiveRecord
class QueryCounter
cattr_accessor :query_count do
0
end
IGNORED_SQL = [/^PRAGMA (?!(table_info))/, /^SELECT currval/, /^SELECT CAST/, /^SELECT @@IDENTITY/, /^SELECT @@ROWCOUNT/, /^SAVEPOINT/, /^ROLLBACK TO SAVEPOINT/, /^RELEASE SAVEPOINT/, /^SHOW max_identifier_length/]
def call(name, start, finish, message_id, values)
# FIXME: this seems bad. we should probably have a better way to indicate
# the query was cached
unless 'CACHE' == values[:name]
self.class.query_count += 1 unless IGNORED_SQL.any? { |r| values[:sql] =~ r }
end
end
end
end
ActiveSupport::Notifications.subscribe('sql.active_record', ActiveRecord::QueryCounter.new)
module ActiveRecord
class Base
def self.count_queries(&block)
ActiveRecord::QueryCounter.query_count = 0
yield
ActiveRecord::QueryCounter.query_count
end
end
end
Du kommer att kunna referera till ActiveRecord::Base.count_queries
metod var som helst. Skicka det ett block där dina frågor körs och det kommer att returnera antalet frågor som har körts:
ActiveRecord::Base.count_queries do
Ticket.first
end
Returnerar "1" för mig. För att få det här att fungera:lägg det i en fil på lib/active_record/query_counter.rb
och kräver det i din config/application.rb
fil så här:
require 'active_record/query_counter'
Hej presto!
Lite förklaring krävs förmodligen. När vi ringer denna linje:
ActiveSupport::Notifications.subscribe('sql.active_record', ActiveRecord::QueryCounter.new)
Vi kopplar in i Rails 3:s lilla meddelanderamverk. Det är ett glänsande litet tillägg till den senaste större versionen av Rails som ingen riktigt känner till. Det tillåter oss att prenumerera på meddelanden om händelser inom Rails genom att använda subscribe
metod. Vi skickar i händelse vi vill prenumerera på som första argument sedan alla objekt som svarar på call
som den andra.
I det här fallet när en fråga exekveras kommer vår lilla frågeräknare plikttroget att öka variabeln ActiveRecord::QueryCounter.query_count, men bara för den riktiga frågor.
Hur som helst, det här var kul. Jag hoppas att det kommer till nytta för dig.