これらの文字列は何と呼ばれますか?スクイッシュとは何ですか?Ruby 質問する

これらの文字列は何と呼ばれますか?スクイッシュとは何ですか?Ruby 質問する

このコードを見つけました:

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 つの空白に圧縮されます。

おすすめ記事