2017-03-21 7 views
3

私はこのコードを見つけました:これらの文字列は何と呼ばれていますか?スキッシュとは何ですか?ルビー

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

スキッシュ、実装されている方法、およびハードコードされたテーブル名がクエリで使用されているのを見てください。私は最良の方法だとは思わないそれをするために。 –

答えて

3

String#squishは、Railsに由来し、結果のインラインストリングには、\n\sが複数含まれていないことを意味します。 docsから:

は、第 ストリングの両端のすべての空白を除去し、次いで つのスペース毎に残りの連続する空白グループを変更、文字列を返します。

2

これはHere DocumentHereDoc)の構文で、Rubyの複数行の文字列です。例えば

、この:保存すべてのスペースや改行と

  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 
     SQL 

はあなたにその値が文字通りあるsql文字列変数を与えます。ヒアドキュメントのドキュメントから

あなたが長い文字列や、あなたドンを持っているときに引用符の人気の用法がある開口部識別子

後にヒアドキュメントの場所でそれをメソッドを呼び出しますそれを1行に書きたいのでHereDocを使いますが、HereDocが保持するすべての改行文字と空白を保持したくない場合は、squish(これはそれらを削除するためにRailsによって追加されたメソッドです)。たとえば、この:1つの空白に踏み付けすべての必然的な改行文字とスペースで

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.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文字列変数を与えます。

+0

それは最も紛らわしいものです。 2番目の区切り文字にメソッドを追加すると、IMHOがより意味をなさないでしょう。しかし、それは 'SQL'を探して、' SQL.squish'を見つけるので、SyntaxErrorを発生させます。それはちょっと変わったものですが、それは一方的にしか動作しません。 –

+0

@EricDuminilというのは、終了コードの代わりに開始識別子にメソッド呼び出しを追加する点です。 –

+0

しかしそれはあまり意味がありません:なぜそれは 'SQL.squish'を探すべきではなく、単に' SQL'を見つけることができると不平を言うのですか? –

関連する問題