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

Compare commits

...

5 Commits

Author SHA1 Message Date
Nicholas Wilson
748ca8d5e4 Merge 5615da920f into 61fc021f52 2025-01-28 19:42:44 -05:00
jbranchaud
61fc021f52 Add Unable To Infer Data Type In Production as a Postgres TIL 2025-01-28 18:40:09 -06:00
jbranchaud
46ad33df7e Add Set Meta Tags In ERB Views as a Rails TIL 2025-01-28 18:30:12 -06:00
Bob Conan
5615da920f Update README.md, fix typos 2024-11-15 16:16:31 -06:00
BobConanDev
c60c63f554 Updated README.md, fix typo(s) 2024-11-15 16:42:57 -05:00
3 changed files with 102 additions and 3 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).
_1577 TILs and counting..._
_1579 TILs and counting..._
See some of the other learning resources I work on:
- [Ruby Operator Lookup](https://www.visualmode.dev/ruby-operators)
@@ -195,7 +195,7 @@ See some of the other learning resources I work on:
- [Aliasing An Ansible Host](devops/aliasing-an-ansible-host.md)
- [Allow Cross-Origin Requests To Include Cookies](devops/allow-cross-origin-requests-to-include-cookies.md)
- [Allow HTTPS Through Your UFW Firewall](devops/allow-https-through-your-ufw-firewall.md)
- [Check For Cached Site Assocation File For iOS](devops/check-for-cached-site-association-file-for-ios.md)
- [Check For Cached Site Association File For iOS](devops/check-for-cached-site-association-file-for-ios.md)
- [Check The Status of All Services](devops/check-the-status-of-all-services.md)
- [Check The Syntax Of nginx Files](devops/check-the-syntax-of-nginx-files.md)
- [Connect To An RDS PostgreSQL Database](devops/connect-to-an-rds-postgresql-database.md)
@@ -767,7 +767,7 @@ See some of the other learning resources I work on:
- [Check If Clusters Are Upgrade Compatible](postgres/check-if-clusters-are-upgrade-compatible.md)
- [Check If The Local Server Is Running](postgres/check-if-the-local-server-is-running.md)
- [Check If User Role Exists For Database](postgres/check-if-user-role-exists-for-database.md)
- [Check Table For Any Oprhaned Records](postgres/check-table-for-any-orphaned-records.md)
- [Check Table For Any Orphaned Records](postgres/check-table-for-any-orphaned-records.md)
- [Checking Inequality](postgres/checking-inequality.md)
- [Checking The Type Of A Value](postgres/checking-the-type-of-a-value.md)
- [Clear The Screen In psql](postgres/clear-the-screen-in-psql.md)
@@ -905,6 +905,7 @@ See some of the other learning resources I work on:
- [Two Ways To Compute Factorial](postgres/two-ways-to-compute-factorial.md)
- [Two Ways To Escape A Quote In A String](postgres/two-ways-to-escape-a-quote-in-a-string.md)
- [Types By Category](postgres/types-by-category.md)
- [Unable To Infer Data Type In Production](postgres/unable-to-infer-data-type-in-production.md)
- [Union All Rows Including Duplicates](postgres/union-all-rows-including-duplicates.md)
- [Use A psqlrc File For Common Settings](postgres/use-a-psqlrc-file-for-common-settings.md)
- [Use A Trigger To Mirror Inserts To Another Table](postgres/use-a-trigger-to-mirror-inserts-to-another-table.md)
@@ -1074,6 +1075,7 @@ See some of the other learning resources I work on:
- [Set DateTime To Include Time Zone In Migrations](rails/set-datetime-to-include-time-zone-in-migrations.md)
- [Set Default As SQL Function In Migration](rails/set-default-as-sql-function-in-migration.md)
- [Set default_url_options For Entire Application](rails/set-default-url-options-for-entire-application.md)
- [Set Meta Tags In ERB Views](rails/set-meta-tags-in-erb-views.md)
- [Set Schema Search Path](rails/set-schema-search-path.md)
- [Set Statement Timeout For All Postgres Connections](rails/set-statement-timeout-for-all-postgres-connections.md)
- [Set The Default Development Port](rails/set-the-default-development-port.md)

View File

@@ -0,0 +1,45 @@
# Unable To Infer Data Type In Production
Inspired by [You Probably Don't Need Query
Builders](https://mattrighetti.com/2025/01/20/you-dont-need-sql-builders), I
wrote a query in one of my applications that has filter clauses that get
short-circuited if the filter value hasn't been included.
That query looked something like this:
```ruby
@tags =
Tag.where("? is null or normalized_value ilike ?", normalized_query, "%#{normalized_query}%")
.order(:normalized_value)
.limit(10)
```
The `normalized_value ilike ?` filtering won't be applied if the
`normalized_query` value isn't present (`nil`). This helps me avoid writing
messy ternaries or if-else conditional query building madness.
Unfortunately, when I shipped this query to production, the page started
failing and Postgres was reporting this error in the logs.
```
Caused by: PG::IndeterminateDatatype (ERROR: could not determine data type of parameter $1)
```
The query is prepared as a parameterized statement and Postgres appears to be
unable to determine the datatype of the first parameter (`$1`) —
`normalized_query`.
I was unable to reproduce the issue in development. It was only occuring in
production. Until I can come up with a root cause analysis, I have the
following fix that does a casting to `text`. This helps out with the type
inference and makes the issue go away.
```ruby
@tags =
Tag.where("cast(? as text) is null or normalized_value ilike ?", normalized_query, "%#{normalized_query}%")
.order(:normalized_value)
.limit(10)
```
Interestingly, this person using `pgtyped` [ran into the exact same issue with
the same type of query](https://github.com/adelsz/pgtyped/issues/354).

View File

@@ -0,0 +1,52 @@
# Set Meta Tags In ERB Views
There are all kinds of meta tags that we may want to set for the pages that our
Rails app serves. A lot of these are for SEO and social sharing. Let's look at
how to add `og:description` meta tags to our views.
I'll start with a helper method in `app/helpers/application_helper.rb`:
```ruby
module ApplicationHelper
def meta_description(desc)
content_for(:description) { desc }
end
end
```
Then, I'll update my `app/views/layouts/application.html.erb` to consume the
description when provided.
```ruby
<!DOCTYPE html>
<html>
<head>
<!-- ... -->
<meta
property="og:description"
content="<%= content_for?(:description) ? yield(:description) : 'Default description' %>"
>
<!-- ... -->
</head>
<!-- ... -->
</html>
```
Now I have a default description for all my views that I can override as needed
with the `meta_description` helper.
```ruby
# app/views/posts/show.html.erb
<%= meta_description @post.body.split("\n").first %>
<!-- ... -->
```
If I reload the page and inspect the meta tags in `<head>`, I should find the
`og:description` tag with the corresponding value.
This can be extended to apply all the different meta tags (e.g. Open Graph and
Twitter) to make links to these pages render well across the internet.