0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

はじめに

各ページで発行された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>

表示の確認

ページを開くとクエリが表示されています。
image.png

N+1が発生しているので、includesするとこんな感じに表示されます。
image.png

終わりに

view側にSQLクエリを表示するのはセキュリティ的にあまりよくないのだと思いますが、検証等で使用するのであればコンソールを見に行かず、viewで確認できるのでデバック等で使えるのではないかと思います。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?