Ruby: Бірнеше сызықты жолды конкатенциалсыз жаза аламын ба?

Бұл көріністі әлдеқайда жақсартудың тәсілі бар ма?

 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' 

Қалайша, біріктіруді білдіретін тәсіл бар ма?

278
25 февр. Zombies 25 ақпанда орнатылған 2010-02-25 23:48 '10 сағат 23:48 2010-02-25 23:48
@ 13 жауап

Бұл сұрақтың жауабы маған қажетті нәрсені алуға көмектесті (қосымша кеңістіктерсіз жеңіл көпжелі конкатенация), бірақ нақты жауаптардың ешқайсысы болмағандықтан, оларды осында құрастырамын:

 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" 

Бонус ретінде, HEREDOC күлкілі синтаксисін қолданатын нұсқасы ( осы сілтеме арқылы):

 p <<END_SQL.gsub(/\s+/, " ").strip SELECT * FROM users ORDER BY users.id DESC END_SQL # >> "SELECT * FROM users ORDER BY users.id DESC" 

Соңғысы негізінен өңдеу кезінде икемділікті қажет ететін жағдайларға байланысты болды. Мен оны өзіме ұнамадым, ол өңдеуді беткі сызықта (яғни, оның алдында, бірақ кейіннен пайда болатын әдіс әдістерін қолдана отырып) елге қояды. END_SQL соңғы END_SQL сәйкестендіргішінен (функция немесе модульдің ішіндегі ең кең таралған) END_SQL болсаңыз, сіз портативті синтаксисті (яғни p <<-END_SQL орнына p <<END_SQL ) пайдалануыңыз керек. . Олай болмаған жағдайда, бос орын шегіністер идентификаторды жолдың жалғасы ретінде түсіндіреді.

Бұл көп кірісті сақтамайды, бірақ мен үшін + белгілерді пайдаланудан жақсы көрінеді.

EDIT: тағы біреуін қосу:

 p %{ SELECT * FROM users ORDER BY users.id DESC }.gsub(/\s+/, " ").strip # >> "SELECT * FROM users ORDER BY users.id DESC" 
405
17 мая '11 в 18:06 2011-05-17 18:06 17 мамырда сағат 17 : 30-да А. Уилсон жауап берді 2011-05-17 18:06

Иә, қосымша сызықтарды қосуға қарсы болмасаңыз:

  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' 
border=0

Балама ретінде, 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 
143
25 февр. Reply by Mark Byers 25 ақпан 2010-02-25 23:50 '10 сағат 23 : 50-де 2010-02-25 23:50

Ruby 2.0-де сіз енді %

Мысалы:

 SQL = %{ SELECT user, name FROM users WHERE users.id = #{var} LIMIT #{var2} } 
128
28 авг. Жауап Robbie Guilfoyle 28 тамызда берілген. 2013-08-28 04:33 '13 at 4:33 2013-08-28 04:33

Сіз оқыған көп жолды жолдар үшін бірнеше синтаксис бар. Менің сүйікті 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} 

Көп жолды жол% q арқылы басталады, содан кейін {, [немесе (, содан кейін тиісті кері қиғаш сызықпен аяқталады.% Q интерполяцияға жол бермейді,% Q мұндай заттарды жазуға болады:

 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} 

Шын мәнінде, мульти-жолды бұл жолдардың қалай аталатынын білмеймін, сондықтан оларды Perl мульти-сызық деп атайық.

Марк пен Питер ұсынған Multi-line Perl немесе heredocs пайдалансаңыз, сіз қажетсіз кеңістіктерге ие боласыз. Менің мысалдарымда және олардың мысалдарында, «from» және «where» жолдарында кодының шегінуіне байланысты жетекші кеңістіктер бар. Егер бұл бос орын талап етілмесе, қазір жасай отырып, біріктірілген жолдарды пайдалануыңыз керек.

46
26 февр. Жауап Хонли 26 ақпан. 2010-02-26 12:13 '10 at 12:13 2010-02-26 12:13

Кейде жолдың жаңа таңбаларын жою қажет \n , мысалы:

 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 
24
16 июля '14 в 9:57 2014-07-16 09:57 жауап 16 шілдеде сағат 09:57 2014-07-16 09:57 беріледі
 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 
14
25 февр. Жауап Питер 25 ақпан. 2010-02-25 23:51 '10 сағат 23:51 2010-02-25 23:51

Сіз сондай-ақ үш қос тырнақшаны пайдалана аласыз.

 x = """ this is a multiline string """ 2.3.3 :012 > x => "\nthis is\na multiline\nstring\n" 

Егер жол үзілімін жою қажет болса, «\ n» әрбір жолдың соңында кері қиғаш сызықты «\» пайдаланыңыз.

8
29 марта '17 в 18:39 2017-03-29 18:39 Жулангонзалез жауап 29 наурыз '17 18:39 2017-03-29 18:39
 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' 

<< - жолдар үшін қосылыс операторы

6
25 февр. Жауапты Д.Брезинский 25 ақпанда берген. 2010-02-25 23:52 '10 сағат 11: 52-те 2010-02-25 23:52

Егер қосымша бос орындарды және жаңа сызықтарды қамтымайтын болсаңыз, пайдалануға болады

 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} * ' ' 

(Интерполирленген жолдар үшін% W пайдаланыңыз)

5
13 марта '13 в 1:09 2013-03-13 01:09 жауап UncleGene берілді 13 наурыз '13 at 1:09 2013-03-13 01:09

Басқа опциялар:

 #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 
5
28 дек. Жауап 28 желтоқсан күні Алекс Коэн берген. 2016-12-28 22:03 '17 сағат 10:03, 2016-12-28 22:03
 conn.exec [ "select attr1, attr2, attr3, ...", "from table1, table2, table3, ...", "where ..." ].join(' ') 

Бұл ұсыныс мұнда басымдылыққа ие - құжаттарды және ұзын желілерді автоиндустраторлар желінің әрбір бөлігінен дұрыс ауытқуы мүмкін. Бірақ бұл тиімділікке қол жеткізіледі.

3
25 февр. Жауап Айдан Кулли 25 ақп. 2010-02-25 23:56 '10 сағат 23:56 2010-02-25 23:56

Жақында, Ruby 2.3-дегі жаңа мүмкіндіктермен squiggly HEREDOC жаңа мульти-сызықты жолдарды минималды өзгерістермен әдемі түрде жазуға мүмкіндік береді. .squish , .squish көмегімен көптеген сызықты кескіндерді жақсы түрде жазуға мүмкіндік береді!

 [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

1
01 окт. Жауап Марк Джад қазан 01 2017-10-01 14:42 '17 at 14:42 2017-10-01 14:42

Әр жолдың жақшаларын жабудың алдын алу үшін, жаңа жолдан шығу үшін, екі жақты тырнақшаларды кері қиғаш сызықпен қолдануға болады:

 "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" 
1
15 июня '16 в 19:34 2016-06-15 19:34 жауап Pwnrar 15 маусым '19 сағат 19:34 2016-06-15 19:34 беріледі

қатысты басқа сұрақтар немесе Сұрақ қою