Jeg tror, du besvarede dit eget spørgsmål ved at nævne assert_queries
, men her kommer:
Jeg vil anbefale at tage et kig på koden bag assert_queries
og bruge det til at bygge din egen metode, som du kan bruge til at tælle forespørgsler. Den vigtigste magi, der er involveret her, er denne linje:
ActiveSupport::Notifications.subscribe('sql.active_record', SQLCounter.new)
Jeg havde lidt af en pille i morges og rippede de dele af ActiveRecord ud, der tæller forespørgslen og kom frem til dette:
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 vil være i stand til at referere til ActiveRecord::Base.count_queries
metode hvor som helst. Send det en blok, hvor dine forespørgsler køres, og det vil returnere antallet af forespørgsler, der er blevet udført:
ActiveRecord::Base.count_queries do
Ticket.first
end
Returnerer "1" for mig. For at få dette til at fungere:læg det i en fil på lib/active_record/query_counter.rb
og kræve det i din config/application.rb
fil som denne:
require 'active_record/query_counter'
Hej presto!
En lille smule forklaring er nok påkrævet. Når vi kalder denne linje:
ActiveSupport::Notifications.subscribe('sql.active_record', ActiveRecord::QueryCounter.new)
Vi tilslutter os Rails 3's lille notifikationsramme. Det er en skinnende lille tilføjelse til den seneste større version af Rails, som ingen rigtig kender til. Det giver os mulighed for at abonnere på meddelelser om begivenheder inden for Rails ved at bruge subscribe
metode. Vi videregiver, hvis vi ønsker at abonnere på det første argument, derefter ethvert objekt, der reagerer på call
som den anden.
I dette tilfælde, når en forespørgsel udføres, vil vores lille forespørgselstæller pligtopfyldende øge ActiveRecord::QueryCounter.query_count-variablen, men kun for den rigtige forespørgsler.
Det var i hvert fald sjovt. Jeg håber, det kommer til nytte for dig.