2017-03-21 4 views
3

fand ich diesen Code:Wie heißen diese Strings? Was ist Squish? 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 

Was ist hier los? Ich nehme an, das ist eine spezielle Art von String-Begrenzer. Wie heißt es? Ist es Ruby spezifisch? Was macht squish?

+1

Siehe [this] (http://apidock.com/rails/String/squish) für Squish, über die Art und Weise, die implementiert wird, und die hardcodiert Tabellenname in der Abfrage verwendet, glaube ich nicht, ist der beste Weg es zu tun. –

Antwort

3

String#squish kommt von Schienen und bedeutet, dass String inline resultierende ohne \n multiple und \s. Von docs:

die Zeichenfolge zurück, zuerst alle Leerzeichen an beiden Enden des Zeichenfolge zu entfernen und dann jeden verbleibenden aufeinanderfolgenden Leerzeichen Gruppen in einen Raum zu verändern.

2

Dies ist eine Syntax für eine Here Document (HereDoc), die ein mehrzeiliges Zeichenfolge in Ruby ist.

Zum Beispiel diese:

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 

geben Ihnen einen sql String-Variable, deren Wert wörtlich:

  UPDATE #{klass.constantize.table_name} 
      SET uuid = uuid_generate_v4(), updated_at = now() 
     WHERE id IN (#{group.map(&:id).join(',')}) 
      AND uuid IS NULL 

mit allen Räumen und Zeilenumbrüche erhalten.

Aus dem heredoc docs:

Um es nach der Eröffnung Kennung

Eine beliebte Verwendung dieses Zitat eine Methode für einen heredoc Ort zu nennen, ist, wenn Sie eine lange Zeichenfolge haben, und Sie don Ich möchte es nicht in einer einzigen Zeile schreiben und daher ein HereDoc dafür verwenden, aber Sie möchten immer noch nicht alle Zeilenfolgen und Leerstellen beibehalten, die das HereDoc beibehält. In diesem Fall können Sie einfach squish anrufen (was ist eine Methode, die von Rails hinzugefügt wurde, um sie zu entfernen. Zum Beispiel diese:

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 

geben Ihnen einen sql String-Variable, deren Wert wörtlich:

UPDATE #{klass.constantize.table_name} SET uuid = uuid_generate_v4(), updated_at = now() WHERE id IN (#{group.map(&:id).join(',')}) AND uuid IS NULL 

mit allen daraus folgenden Zeilenumbrüche und Leerzeichen in ein Leerzeichen zerquetscht.

+0

Das ist am verwirrendsten. Das Hinzufügen der Methode zum zweiten Delimiter hätte IMHO mehr Sinn ergeben. Es löst jedoch einen SyntaxError aus, weil nach "SQL" gesucht wird und "SQL.squish" gefunden wird. Es ist irgendwie komisch, dass es in einer Richtung funktioniert, aber nicht in einer anderen. –

+0

@EricDuminil genau, das ist der Punkt des Hinzufügens des Methodenaufrufs zum Eröffnungsidentifikator anstelle des schließenden. –

+0

Aber es macht nicht viel Sinn: warum sollte es nicht nach "SQL.squish" suchen und sich beschweren, dass es nur 'SQL' finden kann? –