这些字符串叫什么?什么是挤压?红宝石

时间:2017-03-21 17:55:23

标签: ruby-on-rails 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在做什么?

2 个答案:

答案 0 :(得分:5)

这是Here DocumentHereDoc)的语法,它是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文档:

  

要在heredoc上调用方法,请将其放在开头标识符

之后

该引用的一个流行用法是当你有一个很长的字符串并且你不想在一行上写它,因此使用HereDoc,但你仍然不想保留HereDoc保留的所有换行符和空格,在这种情况下,您只需调用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 :(得分:3)

String#squish来自Rails,意味着生成的内联字符串没有多个\n\s。 来自docs

  

返回字符串,首先删除两端的所有空格   字符串,然后将剩余的连续空白组更改为   每个一个空间。