No matter how much I know there are always bits that slip by.
I’ve used Rails for years.
Which means I’ve queried models using
where for years.
Even so, I recently saw someones code and thought, “that can’t work.”
I was wrong.
Imagine a review site where people can comment and optionally leave a rating between 1 and 5.
If I want the highest rated reviews I’ll pass
rating with a value of
> Review.where(rating: 5).to_sql # ... WHERE "reviews"."rating" = 5
If I want all unrated records I’ll pass
ActiveRecord (the part of Rails that handles this) knows SQL doesn’t allow equality checks on
NULL and properly uses
> Review.where(rating: nil).to_sql # ... WHERE "reviews"."rating" IS NULL
I decide to query for two different ratings and give it an array.
ActiveRecord is smart enough to use an
> Review.where(rating: [1, 2]).to_sql # ... WHERE "reviews"."rating" IN (1, 2)
What I saw was an array that contained
My immediate, subconscious reaction was doubt.
I figured it would mess up and try something like
IN (1, 2, NULL).
> Review.where(rating: [1, 2, nil]).to_sql # ... WHERE ("reviews"."rating" IN (1, 2) OR "reviews"."rating" IS NULL)
The docs for
where don’t cover this exact case but it works.
I was pleasantly surprised. I was also reminded. It reminded me of how easy it is to slip into the trap of assumptions. How previous experience, while valuable, can harden a mind and eschew exploration.
I look at the code now and it’s obvious. In the moment, I wouldn’t have done it that way. I would have taken some other more complicated route. It would have worked, but it wouldn’t have been the simplest solution.
No matter how much I know, I need to remember to step back and try to forget everything. Who knows, I might just learn something.