Saya pikir Anda menjawab pertanyaan Anda sendiri dengan menyebutkan assert_queries
, tapi begini:
Saya akan merekomendasikan untuk melihat kode di balik assert_queries
dan menggunakannya untuk membangun metode Anda sendiri yang dapat Anda gunakan untuk menghitung kueri. Sihir utama yang terlibat di sini adalah baris ini:
ActiveSupport::Notifications.subscribe('sql.active_record', SQLCounter.new)
Saya sedikit mengotak-atik pagi ini dan merobek bagian ActiveRecord yang melakukan penghitungan kueri dan menghasilkan ini:
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
Anda akan dapat mereferensikan ActiveRecord::Base.count_queries
metode di mana saja. Berikan blok tempat kueri Anda dijalankan dan itu akan mengembalikan jumlah kueri yang telah dieksekusi:
ActiveRecord::Base.count_queries do
Ticket.first
end
Mengembalikan "1" untuk saya. Untuk membuatnya berfungsi:taruh dalam file di lib/active_record/query_counter.rb
dan minta di config/application.rb
file seperti ini:
require 'active_record/query_counter'
Hei!
Sedikit penjelasan mungkin diperlukan. Saat kita memanggil baris ini:
ActiveSupport::Notifications.subscribe('sql.active_record', ActiveRecord::QueryCounter.new)
Kami menghubungkan ke kerangka pemberitahuan kecil Rails 3. Ini adalah tambahan kecil yang mengilap untuk versi utama terbaru dari Rails yang tidak diketahui oleh siapa pun. Ini memungkinkan kami untuk berlangganan pemberitahuan acara di dalam Rails dengan menggunakan subscribe
metode. Kami meneruskan jika kami ingin berlangganan sebagai argumen pertama, lalu objek apa pun yang merespons call
sebagai yang kedua.
Dalam hal ini ketika kueri dijalankan, penghitung kueri kecil kami akan dengan patuh menaikkan variabel ActiveRecord::QueryCounter.query_count, tetapi hanya untuk nyata kueri.
Bagaimanapun, ini menyenangkan. Semoga bermanfaat bagi Anda.