2013-01-02 2 views
5

Ho un problema di spazio bianco con stringhe multilinea.Spazio bianco con stringa multilinea in rubino

Ho qualcosa di simile a questo nel mio codice in cui sto generando alcuni SQL.

def generate_sql 
    <<-EOQ 
     UPDATE page 
     SET view_count = 10; 
    EOQ 
end 

Ma poi la mia indentazione SQL è tutta incasinata, cosa che non voglio davvero.

"  UPDATE page\n   SET view_count = 10;\n" 

ho potuto fare

def generate_sql 
<<-EOQ 
UPDATE page 
    SET view_count = 10; 
EOQ 
    end 

quali uscite esattamente quello che voglio

"UPDATE page\n SET view_count = 10;\n" 

Ma poi il mio codice di rientro è tutto incasinato, che non ho davvero voglia.

Qualche suggerimento su come meglio ottenere ciò che cerco?

+1

Sei preoccupato per la bellezza di SQL che stai inviando a un DBM e che non verrà presentato agli utenti? * COUGH * * COUGH * [Bikeshedding] (http://en.wikipedia.org/wiki/Parkinson%27s_Law_of_Triviality) * COUGH * –

+0

Non ho detto che non sarà presentato agli utenti – Marklar

risposta

2

rubino 2.3.0 risolve questo bene con il squiggly heredoc. Notare la differenza della tilde/trattino tra gli esempi.

hyphen_heredoc = <<-MULTILINE_STRING 
        One line 
        Second line 
         Indented two spaces 
        MULTILINE_STRING 

squiggly_heredoc = <<~MULTILINE_STRING_WITH_TILDE 
         One line 
         Second line 
         Indented two spaces 
         MULTILINE_STRING_WITH_TILDE 

2.3.0 :001 > puts hyphen_heredoc 
         One line 
         Second line 
         Indented two spaces 
2.3.0 :002 > puts squiggly_heredoc 
One line 
Second line 
    Indented two spaces 

Con la deformata heredoc, il rientro della meno frastagliata linea saranno rimossi da ogni riga del contenuto.

7

Non ci sono librerie come ruby-dedent che consentono di fare

require 'dedent' 

def generate_sql 
    <<-EOQ.dedent 
     UPDATE page 
     SET view_count = 10; 
    EOQ 
end 

che si traduce in

"UPDATE page\n SET view_count = 10;" 
1

Qualcosa del genere dovrebbe farlo:

def generate_sql 
    <<-EOQ.gsub("\n", " ").strip 
    UPDATE page 
     SET ... 
    EOQ 
end 

se in questo caso, il tuo DB ignorerà lo spazio bianco, quindi potrebbe non valere la pena di andare al guaio.

1

Questo richiede un po 'più di spazio (ed è forse meno bella), ma funziona bene:

def generate_sql 
    text = <<-EOQ 
     UPDATE page 
     SET view_count = 10; 
    EOQ 
    text.gsub(/^#{text.match(/^\s*/)[0]}/, '') 
end 

"UPDATE page\n SET view_count = 10;\n"