Edited at

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

More than 3 years have passed since last update.


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

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


参考になりそうなところ

http://edgeguides.rubyonrails.org/active_support_instrumentation.html