Myslím, že jste na svou otázku odpověděli zmínkou assert_queries
, ale tady je:
Doporučuji podívat se na kód za assert_queries
a pomocí toho vytvořit svou vlastní metodu, kterou můžete použít k počítání dotazů. Hlavním kouzlem, které je zde obsaženo, je tento řádek:
ActiveSupport::Notifications.subscribe('sql.active_record', SQLCounter.new)
Dnes ráno jsem si trochu popletl a vytrhl části ActiveRecord, které počítají dotazy, a přišel jsem na toto:
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
Budete moci odkazovat na ActiveRecord::Base.count_queries
metoda kdekoli. Předejte mu blok, ve kterém se spouštějí vaše dotazy, a vrátí počet dotazů, které byly provedeny:
ActiveRecord::Base.count_queries do
Ticket.first
end
Vrací mi "1". Aby to fungovalo:vložte to do souboru na lib/active_record/query_counter.rb
a vyžadovat jej ve vašem config/application.rb
soubor takto:
require 'active_record/query_counter'
Ahoj!
Asi je potřeba trochu vysvětlení. Když zavoláme na tuto linku:
ActiveSupport::Notifications.subscribe('sql.active_record', ActiveRecord::QueryCounter.new)
Zapojujeme se do malého rámce oznámení Rails 3. Je to malý lesklý doplněk k nejnovější hlavní verzi Rails, o kterém nikdo pořádně neví. Umožňuje nám přihlásit se k odběru upozornění na události v rámci Rails pomocí subscribe
metoda. Předáme v případě, že se chceme přihlásit jako první argument, pak jakýkoli objekt, který odpovídá na call
jako druhý.
V tomto případě, když je dotaz proveden, náš malý čítač dotazů poslušně zvýší proměnnou ActiveRecord::QueryCounter.query_count, ale pouze pro skutečné dotazy.
Každopádně to byla zábava. Doufám, že vám to bude užitečné.