RailsでSQLのログを改行無しで出力する「squish」メソッド

こんにちは!kossyです!




今回は、RailsSQLのログを改行無しで出力する「squish」メソッドについて、ブログに残してみたいと思います。




環境
Ruby 2.6.6
Rails 6.0.3
Docker for Mac



使い方

Employeeモデルにlength_of_serviceというscopeが生えているとします。

  scope :length_of_service, -> () {
    query = <<-SQL
      SELECT id, last_name, first_name,
      (COALESCE(retired_at, current_date) - hired_at) / 365 as length_of_service
      FROM employees
      ORDER BY id ASC
    SQL

    find_by_sql(query)
  }

実行結果は以下です。

$ Employee.length_of_service


  Employee Load (27.3ms)        SELECT id, last_name, first_name,
      (COALESCE(retired_at, current_date) - hired_at) / 365 as length_of_service
      FROM employees
      ORDER BY id ASC

このscopeにsquishメソッドを用いてみます。

  scope :length_of_service, -> () {
    query = <<-SQL.squish # 追加
      SELECT id, last_name, first_name,
      (COALESCE(retired_at, current_date) - hired_at) / 365 as length_of_service
      FROM employees
      ORDER BY id ASC
    SQL

    find_by_sql(query)
  }
$ Employee.length_of_service
  Employee Load (9.7ms)  SELECT id, last_name, first_name, (COALESCE(retired_at, current_date) - hired_at) / 365 as length_of_service FROM employees ORDER BY id ASC

改行が取り除かれて、一行で出力されるようになりました。

railsguides.jp

処理そのものは、冒頭と末尾のホワイトスペースを除去し連続したホワイトスペースを1つに減らすとのことなので、
SQLの改行を消去する以外でも使い道はありそうです。


大いに参考にさせていただいたサイト

この場を借りて御礼を申し上げます。

String#squish で長い SQL 文字列を 1 行にする - Qiita