Creo que respondiste tu propia pregunta mencionando assert_queries
, pero aquí va:
Recomendaría echar un vistazo al código detrás de assert_queries
y usar eso para construir su propio método que puede usar para contar consultas. La principal magia involucrada aquí es esta línea:
ActiveSupport::Notifications.subscribe('sql.active_record', SQLCounter.new)
Tuve un poco de retoques esta mañana y arranqué las partes de ActiveRecord que hacen el conteo de consultas y se me ocurrió 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 ActiveRecord::Base.count_queries
método en cualquier lugar. Pásale un bloque en el que se ejecutan tus consultas y te devolverá el número de consultas que se han ejecutado:
ActiveRecord::Base.count_queries do
Ticket.first
end
Me devuelve "1". Para que esto funcione:ponlo en un archivo en lib/active_record/query_counter.rb
y solicitarlo en su config/application.rb
archivo como este:
require 'active_record/query_counter'
¡Oye, 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 adición brillante a la última versión principal de Rails que nadie realmente conoce. Nos permite suscribirnos a notificaciones de eventos dentro de Rails usando el subscribe
método. Pasamos el evento al que queremos suscribirnos como primer argumento y luego cualquier objeto que responda a call
como el segundo.
En este caso, cuando se ejecuta una consulta, nuestro pequeño contador de consultas incrementará diligentemente la variable ActiveRecord::QueryCounter.query_count, pero solo para el real consultas.
De todos modos, esto fue divertido. Espero que te sea útil.