このコードを見つけました:
sql = <<-SQL.squish
UPDATE #{klass.constantize.table_name}
SET uuid = uuid_generate_v4(), updated_at = now()
WHERE id IN (#{group.map(&:id).join(',')})
AND uuid IS NULL
SQL
ここで何が起こっているのでしょうか? これは、何らかの特殊な文字列区切り文字だと思います。これは何と呼ばれているのでしょうか? Ruby 固有のものですか? 何をsquish
しているのでしょうか?
ベストアンサー1
これは、ヒアドキュメント( HereDoc
) は Ruby の複数行文字列です。
たとえば、次のようになります。
sql = <<-SQL
UPDATE #{klass.constantize.table_name}
SET uuid = uuid_generate_v4(), updated_at = now()
WHERE id IN (#{group.map(&:id).join(',')})
AND uuid IS NULL
SQL
sql
文字通り次の値を持つ文字列変数が提供されます:
UPDATE #{klass.constantize.table_name}
SET uuid = uuid_generate_v4(), updated_at = now()
WHERE id IN (#{group.map(&:id).join(',')})
AND uuid IS NULL
すべてのスペースと改行が保持されます。
HereDoc ドキュメントより:
ヒアドキュメントのメソッドを呼び出すには、開始識別子の後に配置します。
この引用符の一般的な使い方は、長い文字列があり、それを1行に書きたくないのでヒアドキュメントを使用するが、ヒアドキュメントが保持するすべての改行文字と空白を保持したくない場合です。その場合は、次のように呼び出すだけです。squish
(これは Rails によって追加されたメソッドです) を使用して削除します。たとえば、次のようになります。
sql = <<-SQL.squish
UPDATE #{klass.constantize.table_name}
SET uuid = uuid_generate_v4(), updated_at = now()
WHERE id IN (#{group.map(&:id).join(',')})
AND uuid IS NULL
SQL
sql
文字通り次の値を持つ文字列変数が提供されます:
UPDATE #{klass.constantize.table_name} SET uuid = uuid_generate_v4(), updated_at = now() WHERE id IN (#{group.map(&:id).join(',')}) AND uuid IS NULL
後続の改行文字とスペースはすべて 1 つの空白に圧縮されます。