Y a-t-il un moyen d'améliorer cet aspect?
conn.exec 'select attr1, attr2, attr3, attr4, attr5, attr6, attr7 ' +
'from table1, table2, table3, etc, etc, etc, etc, etc, ' +
'where etc etc etc etc etc etc etc etc etc etc etc etc etc'
Comme, y a-t-il un moyen d'impliquer la concaténation?
Il y a des éléments de cette réponse qui m'ont aidé à obtenir ce dont j'avais besoin (concaténation simple sur plusieurs lignes SANS espace supplémentaire), mais comme aucune des réponses actuelles ne l'avait, je les compile ici:
str = 'this is a multi-line string'\
' using implicit concatenation'\
' to prevent spare \n\'s'
=> "this is a multi-line string using implicit concatenation to eliminate spare
\\n's"
En bonus, voici une version utilisant la syntaxe amusante HEREDOC (via ce lien ):
p <<END_SQL.gsub(/\s+/, " ").strip
SELECT * FROM users
ORDER BY users.id DESC
END_SQL
# >> "SELECT * FROM users ORDER BY users.id DESC"
Ce dernier serait principalement pour des situations qui nécessitaient plus de flexibilité dans le traitement. Personnellement, je n'aime pas ça, cela met le traitement dans un endroit étrange où w.r.t. la chaîne (c'est-à-dire devant, mais en utilisant des méthodes d'instance qui viennent généralement après), mais c'est là. Notez que si vous indentez le dernier identifiant END_SQL
(qui est commun, puisqu'il se trouve probablement dans une fonction ou un module), vous devrez utiliser la syntaxe composée d'un trait d'union (c'est-à-dire p <<-END_SQL
au lieu de p <<END_SQL
). Sinon, les espaces blancs indentés font que l'identifiant est interprété comme une continuation de la chaîne.
Cela ne fait pas économiser beaucoup de frappe, mais cela me semble plus agréable que d'utiliser des signes +.
EDIT: Ajouter un de plus:
p %{
SELECT * FROM users
ORDER BY users.id DESC
}.gsub(/\s+/, " ").strip
# >> "SELECT * FROM users ORDER BY users.id DESC"
Oui, si les nouvelles lignes supplémentaires insérées ne vous dérangent pas:
conn.exec 'select attr1, attr2, attr3, attr4, attr5, attr6, attr7
from table1, table2, table3, etc, etc, etc, etc, etc,
where etc etc etc etc etc etc etc etc etc etc etc etc etc'
Sinon, vous pouvez utiliser un heredoc :
conn.exec <<-eos
select attr1, attr2, attr3, attr4, attr5, attr6, attr7
from table1, table2, table3, etc, etc, etc, etc, etc,
where etc etc etc etc etc etc etc etc etc etc etc etc etc
eos
Dans Ruby 2.0, vous pouvez maintenant simplement utiliser %
Par exemple:
SQL = %{
SELECT user, name
FROM users
WHERE users.id = #{var}
LIMIT #{var2}
}
Il existe plusieurs syntaxes pour les chaînes multilignes que vous avez déjà lues. Mon préféré est le style Perl:
conn.exec %q{select attr1, attr2, attr3, attr4, attr5, attr6, attr7
from table1, table2, table3, etc, etc, etc, etc, etc,
where etc etc etc etc etc etc etc etc etc etc etc etc etc}
La chaîne multiligne commence par% q, suivie par un {, [ou (, puis se termine par le caractère inversé correspondant.% Q ne permet pas l'interpolation;% Q le permet, vous pouvez écrire des choses comme ceci:
conn.exec %Q{select attr1, attr2, attr3, attr4, attr5, attr6, attr7
from #{table_names},
where etc etc etc etc etc etc etc etc etc etc etc etc etc}
En fait, je ne sais pas du tout comment s'appellent ces types de chaînes multilignes, appelons-les simplement des multilignes Perl.
Notez cependant que si vous utilisez des multilignes Perl ou des heredocs comme l'ont suggéré Mark et Peter, vous vous retrouverez avec des espaces potentiellement inutiles. Tant dans mes exemples que dans leurs exemples, les lignes "de" et "où" contiennent des blancs, en raison de leur indentation dans le code. Si cet espace n'est pas souhaité, vous devez utiliser des chaînes concaténées comme vous le faites maintenant.
Il est parfois utile de supprimer les nouveaux caractères de ligne \n
comme:
conn.exec <<-eos.squish
select attr1, attr2, attr3, attr4, attr5, attr6, attr7
from table1, table2, table3, etc, etc, etc, etc, etc,
where etc etc etc etc etc etc etc etc etc etc etc etc etc
eos
Vous pouvez également utiliser des guillemets doubles
x = """
this is
a multiline
string
"""
2.3.3 :012 > x
=> "\nthis is\na multiline\nstring\n"
Si nécessaire pour supprimer les sauts de ligne "\ n", utilisez une barre oblique inverse "\" à la fin de chaque ligne.
conn.exec = <<eos
select attr1, attr2, attr3, attr4, attr5, attr6, attr7
from table1, table2, table3, etc, etc, etc, etc, etc,
where etc etc etc etc etc etc etc etc etc etc etc etc etc
eos
Autres options:
#multi line string
multiline_string = <<EOM
This is a very long string
that contains interpolation
like #{4 + 5} \n\n
EOM
puts multiline_string
#another option for multiline string
message = <<-EOF
asdfasdfsador #{2+2} this month.
asdfadsfasdfadsfad.
EOF
puts message
Récemment, avec les nouvelles fonctionnalités de Ruby 2.3, le nouveau squiggly HEREDOC
vous permettra d'écrire nos chaînes multilignes de manière agréable, avec un changement minime, si bien que si vous le combinez avec le .squish
écrivez multiligne de façon sympa!
[1] pry(main)> <<~SQL.squish
[1] pry(main)* select attr1, attr2, attr3, attr4, attr5, attr6, attr7
[1] pry(main)* from table1, table2, table3, etc, etc, etc, etc, etc,
[1] pry(main)* where etc etc etc etc etc etc etc etc etc etc etc etc etc
[1] pry(main)* SQL
=> "select attr1, attr2, attr3, attr4, attr5, attr6, attr7 from table1, table2, table3, etc, etc, etc, etc, etc, where etc etc etc etc etc etc etc etc etc etc etc etc etc"
ref: https://infinum.co/the-capsized-eight/multiline-strings-Ruby-2-3-0-the-squiggly-heredoc
conn.exec 'select attr1, attr2, attr3, attr4, attr5, attr6, attr7 ' <<
'from table1, table2, table3, etc, etc, etc, etc, etc, ' <<
'where etc etc etc etc etc etc etc etc etc etc etc etc etc'
<< est l'opérateur de concaténation pour les chaînes
Si vous faites pensez à des espaces supplémentaires et des nouvelles lignes, vous pouvez utiliser
conn.exec %w{select attr1, attr2, attr3, attr4, attr5, attr6, attr7
from table1, table2, table3, etc, etc, etc, etc, etc,
where etc etc etc etc etc etc etc etc etc etc etc etc etc} * ' '
(utilisez% W pour les chaînes interpolées)
conn.exec [
"select attr1, attr2, attr3, ...",
"from table1, table2, table3, ...",
"where ..."
].join(' ')
Cette suggestion présente l'avantage par rapport aux documents et aux longues chaînes que les auto-indenteurs peuvent indenter chaque partie de la chaîne de manière appropriée. Mais cela a un coût d'efficacité.
Pour éviter de fermer les parenthèses pour chaque ligne, vous pouvez simplement utiliser des guillemets doubles avec une barre oblique inverse pour échapper à la nouvelle ligne:
"select attr1, attr2, attr3, attr4, attr5, attr6, attr7 \
from table1, table2, table3, etc, etc, etc, etc, etc, \
where etc etc etc etc etc etc etc etc etc etc etc etc etc"