diff --git a/README.md b/README.md index da1093d..d9987a7 100644 --- a/README.md +++ b/README.md @@ -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). -_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) - [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) +- [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) - [Summing Collections](ruby/summing-collections.md) - [Triple Equals: The Case Equality Operator](ruby/triple-equals-the-case-equality-operator.md) diff --git a/ruby/stack-heredocs-in-a-method-call.md b/ruby/stack-heredocs-in-a-method-call.md new file mode 100644 index 0000000..7789663 --- /dev/null +++ b/ruby/stack-heredocs-in-a-method-call.md @@ -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.