1
0
mirror of https://github.com/jbranchaud/til synced 2026-01-03 07:08:01 +00:00

Add Stack Heredocs In A Method Call as a Ruby TIL

This commit is contained in:
jbranchaud
2024-11-25 16:00:16 -06:00
parent 98d8249cf1
commit 6af86bd407
2 changed files with 39 additions and 1 deletions

View File

@@ -10,7 +10,7 @@ pairing with smart people at Hashrocket.
For a steady stream of TILs, [sign up for my newsletter](https://crafty-builder-6996.ck.page/e169c61186). For a steady stream of TILs, [sign up for my newsletter](https://crafty-builder-6996.ck.page/e169c61186).
_1516 TILs and counting..._ _1517 TILs and counting..._
--- ---
@@ -1294,6 +1294,7 @@ _1516 TILs and counting..._
- [Specify How Random Array#sample Is](ruby/specify-how-random-array-sample-is.md) - [Specify How Random Array#sample Is](ruby/specify-how-random-array-sample-is.md)
- [Split A Float Into Its Integer And Decimal](ruby/split-a-float-into-its-integer-and-decimal.md) - [Split A Float Into Its Integer And Decimal](ruby/split-a-float-into-its-integer-and-decimal.md)
- [Squeeze Out The Extra Space](ruby/squeeze-out-the-extra-space.md) - [Squeeze Out The Extra Space](ruby/squeeze-out-the-extra-space.md)
- [Stack Heredocs In A Method Call](ruby/stack-heredocs-in-a-method-call.md)
- [String Interpolation With Instance Variables](ruby/string-interpolation-with-instance-variables.md) - [String Interpolation With Instance Variables](ruby/string-interpolation-with-instance-variables.md)
- [Summing Collections](ruby/summing-collections.md) - [Summing Collections](ruby/summing-collections.md)
- [Triple Equals: The Case Equality Operator](ruby/triple-equals-the-case-equality-operator.md) - [Triple Equals: The Case Equality Operator](ruby/triple-equals-the-case-equality-operator.md)

View File

@@ -0,0 +1,37 @@
# Stack Heredocs In A Method Call
When you put a heredoc directly in a method call as an argument, it is only the
opening identifier that goes in the argument list.
That looks like this:
```ruby
execute_in_transaction(<<~SQL)
update reading_statuses
set status = 'abandoned'
where started_at < (now() - '2 years'::interval)
and finished_at is null;
SQL
```
You might imagine then that we can put multiple heredocs in a method call. That
leads to [_stacked
heredocs_](https://www.visualmode.dev/ruby-operators/heredoc#stacked-heredocs).
```ruby
execute_in_transaction(<<~SQL1, <<~SQL2, <<~SQL3)
update reading_statuses
set status = 'abandoned'
where started_at < (now() - '2 years'::interval)
and finished_at is null;
SQL1
insert into activity_log (name, description)
values ('abandon_books', 'Mark unread books as abandoned');
SQL2
delete from background_jobs
where id = #{job_id}; -- better to sanitize values like this
SQL3
```
Notice we terminate the body of each heredoc with its closing identifier and
immediately begin the body of the next one.