Je pense que vous avez répondu à votre propre question en mentionnant assert_queries
mais c'est parti :
Je vous recommande de jeter un coup d'œil au code qui se trouve derrière assert_queries
et l'utiliser pour construire votre propre méthode que vous pouvez utiliser pour compter les requêtes. La principale magie impliquée ici est cette ligne :
ActiveSupport::Notifications.subscribe('sql.active_record', SQLCounter.new)
J'ai un peu bricolé ce matin et j'ai retiré les parties d'ActiveRecord qui font le comptage des requêtes et j'ai trouvé ceci :
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
Vous pourrez faire référence à la ActiveRecord::Base.count_queries
n'importe où. Passez-lui un bloc dans lequel vos requêtes sont exécutées et elle retournera le nombre de requêtes qui ont été exécutées :
ActiveRecord::Base.count_queries do
Ticket.first
end
Il renvoie "1" pour moi. Pour que cela fonctionne : mettez-le dans un fichier à lib/active_record/query_counter.rb
et l'exiger dans votre config/application.rb
comme ceci :
require 'active_record/query_counter'
Hey presto !
Un peu d'explication est probablement nécessaire. Quand on appelle cette ligne :
ActiveSupport::Notifications.subscribe('sql.active_record', ActiveRecord::QueryCounter.new)
Nous utilisons le petit cadre de notifications de Rails 3. C'est un petit ajout brillant à la dernière version majeure de Rails que personne ne connaît vraiment. Il nous permet de nous abonner à des notifications d'événements dans Rails en utilisant la fonction subscribe
méthode. Nous transmettons l'événement auquel nous voulons nous abonner en tant que premier argument, puis tout objet qui répond à la méthode call
comme le second.
Dans ce cas, lorsqu'une requête est exécutée, notre petit compteur de requêtes incrémente consciencieusement la variable ActiveRecord::QueryCounter.query_count, mais seulement pour la période de temps suivante. réel des requêtes.
Bref, c'était sympa. J'espère que ça vous sera utile.