ActiveRecordで発行されたクエリの数を計測してテストに利用する


特定の処理中に発行されたクエリ数を取得する

気を抜くと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に流しているからです。

参考になりそうなところ