Creo que responde a su propia pregunta mencionando assert_queries
, pero aquí va:
recomendaría echar un vistazo al código detrás assert_queries
y utilizarlo para construir su propio método que se puede utilizar para contar las consultas. La principal magia en juego aquí es la siguiente línea:
ActiveSupport::Notifications.subscribe('sql.active_record', SQLCounter.new)
que tenía un poco de un hojalatero esta mañana y arranqué las partes de ActiveRecord que hacen el recuento de consulta y se acercó con esto:
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
Podrá hacer referencia al método ActiveRecord::Base.count_queries
en cualquier lugar. Pasarlo un bloque en el que sus consultas se ejecutan y se devolverá el número de consultas que han sido ejecutadas:
ActiveRecord::Base.count_queries do
Ticket.first
end
Devuelve "1" para mí. Para realizar este trabajo: la puso en un archivo en lib/active_record/query_counter.rb
y lo requiera en su archivo config/application.rb
así:
require 'active_record/query_counter'
¡listo!
Probablemente se requiera un poco de explicación. Cuando llamamos a esta línea:
ActiveSupport::Notifications.subscribe('sql.active_record', ActiveRecord::QueryCounter.new)
Nos conectamos al pequeño marco de notificaciones de Rails 3. Es una pequeña y brillante adición a la última versión principal de Rails que nadie conoce realmente. Nos permite suscribir notificaciones de eventos dentro de Rails utilizando el método subscribe
. Pasamos el evento en el que deseamos suscribirnos como primer argumento, luego cualquier objeto que responda a call
como el segundo.
En este caso, cuando se ejecuta una consulta, nuestro pequeño contador de consultas aumentará diligentemente la variable ActiveRecord :: QueryCounter.query_count, pero solo para las consultas reales.
De todos modos, esto fue divertido. Espero que te sea útil.
Excelente script. Si solo lo está utilizando para realizar pruebas, puede colocarlo en un archivo {spec | test} /support/query_counter.rb. Mantenga la carpeta lib para la lógica de la aplicación. – Forrest
Cualquier forma de hacer que esto funcione en .18.7 –
Para aquellos que buscan un compatibilizador RSpec, esta respuesta se ha convertido en una gema: ['rspec-sqlimit'] (https://github.com/nepalez/rspec-sqlimit) . –