Je pense que vous avez répondu à votre propre question en mentionnant assert_queries
, mais voilà :
Je recommanderais de jeter un œil au code derrière assert_queries
et l'utiliser pour créer votre propre méthode que vous pouvez utiliser pour compter les requêtes. La magie principale impliquée ici est cette ligne :
ActiveSupport::Notifications.subscribe('sql.active_record', SQLCounter.new)
J'ai eu un peu de bricolage ce matin et j'ai extrait les parties d'ActiveRecord qui comptent la requête 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 référencer le ActiveRecord::Base.count_queries
méthode n'importe où. Passez-lui un bloc dans lequel vos requêtes sont exécutées et il renverra le nombre de requêtes qui ont été exécutées :
ActiveRecord::Base.count_queries do
Ticket.first
end
Renvoie "1" pour moi. Pour que cela fonctionne :mettez-le dans un fichier à lib/active_record/query_counter.rb
et exigez-le dans votre config/application.rb
fichier comme celui-ci :
require 'active_record/query_counter'
Hé hop !
Un peu d'explication est probablement nécessaire. Lorsque nous appelons cette ligne :
ActiveSupport::Notifications.subscribe('sql.active_record', ActiveRecord::QueryCounter.new)
Nous nous connectons au petit framework 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 aux notifications d'événements dans Rails en utilisant le subscribe
méthode. On passe dans l'événement auquel on veut s'abonner comme premier argument puis tout objet qui répond à call
comme deuxième.
Dans ce cas, lorsqu'une requête est exécutée, notre petit compteur de requêtes incrémentera consciencieusement la variable ActiveRecord::QueryCounter.query_count, mais uniquement pour le réel requêtes.
Quoi qu'il en soit, c'était amusant. J'espère que cela vous sera utile.