Rubyで長い文字列を複数行に分けて書く

こんなケース

  • 長い文字列を複数行に分けて書きたい
  • 得られる文字列に改行や不要な空白が含まれないで欲しい
  • 美しくインデントされたコードになって欲しい

ヒアドキュメントだったり+で連結したり色々方法があるのだが、Rubyでは以下の記法が推奨されるらしい

sql = 'SELECT * ' \
      'FROM users ' \
      'WHERE active = 1 ' \
      'ORDER BY id' 

puts sql

以下のように出力される

SELECT * FROM users WHERE active = 1 ORDER BY id

これは一体何?

Rubyでは空白を間に挟んで複数の文字列リテラルを並べると1つの文字列として扱われる

str = 'a' 'b' 'c'
puts str

これは以下のように出力される

abc

また、Rubyでは改行は文の終了を表すが、文末にバックスラッシュを置くと文の終了ではなく次の行に文が続いているものとして構文解析される。よって

str = 'a' \
      'b' \
      'c'

str = 'a' 'b' 'c'

と同等となる

まるでバックスラッシュが+の代わりになってるように見えて知らないと面食らう構文だが、これが推奨らしい

その他の方法

ヒアドキュメント <<~ が良さそう

def build_sql 
  sql = <<~SQL
    SELECT * \
    FROM users \
    WHERE created_at > '2022-01-01' \
    AND enabled = 1 \
    AND state = 'active' \
    ORDER BY id;
  SQL
  sql
end

puts build_sql
SELECT * FROM users WHERE created_at > '2022-01-01' AND enabled = 1 AND state = 'active' ORDER BY id;

余分な改行や空白が含まれない文字列が得られる