Ik denk dat je je eigen vraag hebt beantwoord door assert_queries
. te noemen , maar hier komt:
Ik zou aanraden om de code achter assert_queries
te bekijken en dat te gebruiken om uw eigen methode te bouwen die u kunt gebruiken om query's te tellen. De belangrijkste magie die hierbij betrokken is, is deze regel:
ActiveSupport::Notifications.subscribe('sql.active_record', SQLCounter.new)
Ik was vanmorgen een beetje aan het sleutelen en scheurde de delen van ActiveRecord eruit die de query's tellen en kwam met dit op de proppen:
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
U kunt verwijzen naar de ActiveRecord::Base.count_queries
methode overal. Geef het een blok door waarin uw zoekopdrachten worden uitgevoerd en het zal het aantal uitgevoerde zoekopdrachten retourneren:
ActiveRecord::Base.count_queries do
Ticket.first
end
Retourneert "1" voor mij. Om dit te laten werken:plaats het in een bestand op lib/active_record/query_counter.rb
en vereist het in uw config/application.rb
bestand als volgt:
require 'active_record/query_counter'
Hallo!
Een klein beetje uitleg is waarschijnlijk vereist. Als we deze regel noemen:
ActiveSupport::Notifications.subscribe('sql.active_record', ActiveRecord::QueryCounter.new)
We haken in op het kleine notificatiekader van Rails 3. Het is een glimmende kleine toevoeging aan de nieuwste grote versie van Rails waar niemand echt iets vanaf weet. Hiermee kunnen we ons abonneren op meldingen van evenementen binnen Rails met behulp van de subscribe
methode. We geven door in het geval dat we ons willen abonneren als het eerste argument en vervolgens elk object dat reageert op call
als de tweede.
In dit geval, wanneer een query wordt uitgevoerd, zal onze kleine queryteller plichtsgetrouw de ActiveRecord::QueryCounter.query_count variabele verhogen, maar alleen voor de echte vragen.
Dit was in ieder geval leuk. Ik hoop dat het nuttig voor je is.