はじめに
各ページで発行されたSQLクエリはログを見れば分かります。
ただ、そのログをview側で確認してみたいといったとき、やり方を知らなかったので今回やってみました。
SQLクエリをview側に表示する
やり方は考えれば色々あると思いますが、今回はActiveSupport
を使用してログを表示してみたいと思います。
application_controller.rb
にインスタンス変数を定義
app/controllers/application_controller.rb
class ApplicationController < ActionController::Base
before_action :setup_query_logs
private
def setup_query_logs
@query_logs = []
ActiveSupport::Notifications.subscribe "sql.active_record" do |name, started, finished, unique_id, data|
@query_logs << data[:sql]
end
end
end
ActiveSupport::Notifications.subscribe
を使用して、sql.active_record
というイベントに対してサブスクライブ(購読)します。
ActiveRecordがSQLクエリを実行するたびに、ブロック内の処理が実行されます。
発行されたクエリを@query_logsに格納します。
ActiveSupport::Notifications.subscribeの詳しい説明はこちらから確認できます。
application.html.erb
を修正
SQLクエリをview側に表示させるため、コードを修正します。
app/views/layouts/application.html.erb
<body>
<%= yield %>
<h2>Query Logs</h2>
<ul>
<% if @query_logs %>
<% @query_logs.each do |query| %>
<li><%= query %></li>
<% end %>
<% end %>
</ul>
</body>
表示の確認
N+1が発生しているので、includesするとこんな感じに表示されます。
終わりに
view側にSQLクエリを表示するのはセキュリティ的にあまりよくないのだと思いますが、検証等で使用するのであればコンソールを見に行かず、viewで確認できるのでデバック等で使えるのではないかと思います。