assert_queries
に言及して、あなた自身の質問に答えたと思います 、しかしここに行きます:
assert_queries
の背後にあるコードを確認することをお勧めします それを使用して、クエリのカウントに使用できる独自のメソッドを構築します。ここに含まれる主な魔法は次の行です:
ActiveSupport::Notifications.subscribe('sql.active_record', SQLCounter.new)
今朝少しいじくり回して、クエリカウントを行うActiveRecordの部分を取り除いて、これを思いついた:
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
ActiveRecord::Base.count_queries
を参照できるようになります どこでもメソッド。クエリが実行されるブロックを渡すと、実行されたクエリの数が返されます:
ActiveRecord::Base.count_queries do
Ticket.first
end
「1」を返します。これを機能させるには:lib/active_record/query_counter.rb
のファイルに入れます config/application.rb
でそれを要求します このようなファイル:
require 'active_record/query_counter'
やあプレスト!
おそらく少し説明が必要です。この行を呼び出すとき:
ActiveSupport::Notifications.subscribe('sql.active_record', ActiveRecord::QueryCounter.new)
Rails3の小さな通知フレームワークに接続します。これは、誰も実際に知らないRailsの最新のメジャーバージョンへの光沢のある小さな追加です。 subscribe
を使用して、Rails内のイベントの通知をサブスクライブできます。 方法。サブスクライブするイベントを最初の引数として渡し、次にcall
に応答するオブジェクトを渡します。 2番目として。
この場合、クエリが実行されると、小さなクエリカウンターがActiveRecord ::QueryCounter.query_count変数を忠実にインクリメントしますが、これは real のみです クエリ。
とにかく、これは楽しかったです。お役に立てば幸いです。