#特定の処理中に発行されたクエリ数を取得する
気を抜くとN+1問題がすぐ起こりそうな場所があったので
RSpec上で特定の処理中にActiveRecordが発行したクエリの数を取得してみました。
thread = Thread.current
count_up = lambda do |*_args|
return unless thread == Thread.current
query_count += 1
end
ActiveSupport::Notifications.subscribed(count_up, 'sql.active_record') do
User.count
end
p query_count # => 1
ActiveSupport::Notificationsの仕組みを使えばSQLの実行数の他にもテンプレートのレンダリング数とかいろいろ便利に利用できると思います。
Thread.currentのチェックを入れているのはRSpec中にJobをThreadに流しているからです。
#参考になりそうなところ