Benito Serna
Ruby, Rails, TDD...

Guide to name scopes based on column types

As you may now there are two hard things in computer science and one of them is naming things.

And although naming things is an art, is not bad to have a little guide on how to do it.

That’s why I want to share with you a guide on how to name scopes that depend on a single column based on its type.

This suggestion is based on a very interesting gem called type_scopes, that I found on reddit.

I think that even if you don’t use the gem you can benefit from the names that it is proposing. Maybe it won’t fit all cases but I think that it could make our work a little easier.

Date

Record.received_to("2017-09-06")
# => where("received_on <= '2017-09-06'")

Record.received_from("2017-09-06")
# => where("received_on >= '2017-09-06'")

Record.received_after("2017-09-06")
# => where("received_on > '2017-09-06'")

Record.received_before("2017-09-06")
# => where("received_on < '2017-09-06'")

Record.received_between("2017-09-06", "2017-09-07")
# => where("received_on BETWEEN '2017-09-06' AND '2017-09-07'")

Record.received_not_between("2017-09-06", "2017-09-07")
# => where("received_on NOT BETWEEN '2017-09-06' AND '2017-09-07'")

Record.received_within("2017-09-06", "2017-09-07")
# => where("received_on > '2017-09-06' AND received_on < '2017-09-07'")

Record.received_not_within("2017-09-06", "2017-09-07")
# => where("received_on <= '2017-09-06' OR received_on >= '2017-09-07'")

Datetime

Record.completed_to("2017-09-06")
# => where("completed_at <= '2017-09-06'")

Record.completed_from("2017-09-06")
# => where("completed_at >= '2017-09-06'")

Record.completed_after("2017-09-06")
# => where("completed_at > '2017-09-06'")

Record.completed_before("2017-09-06")
# => where("completed_at < '2017-09-06'")

Record.completed_between("2017-09-06", "2017-09-07")
# => where("completed_at BETWEEN '2017-09-06' AND '2017-09-07'")

Record.completed_not_between("2017-09-06", "2017-09-07")
# => where("completed_at NOT BETWEEN '2017-09-06' AND '2017-09-07'")

Record.completed_within("2017-09-06", "2017-09-07")
# => where("completed_at > '2017-09-06' AND completed_at < '2017-09-07'")

Record.completed_not_within("2017-09-06", "2017-09-07")
# => where("completed_at <= '2017-09-06' OR completed_at >= '2017-09-07'")

Numeric

Record.price_to(100)
# => where("price <= 100")

Record.price_from(100)
# => where("price >= 100")

Record.price_above(100)
# => where("price > 100")

Record.price_below(100)
# => where("price < 100")

Record.price_between(100, 200)
# => where("price BETWEEN 100 AND 200")

Record.price_not_between(100, 200)
# => where("price NOT BETWEEN 100 AND 200")

Record.price_within(100, 200)
# => where("price > 100 AND price < 200")

Record.price_not_within(100, 200)
# => where("price <= 100 OR price >= 200")

String

Record.name_contains("foo")
# => where("name LIKE '%foo%'")

Record.name_contains("foo", sensitive: false)
# => where("name ILIKE '%foo%'")

Record.name_starts_with("foo")
# => where("name LIKE 'foo%'")

Record.name_starts_with("foo", sensitive: false)
# => where("name ILIKE 'foo%'")

Record.name_ends_with("foo")
# => where("name LIKE '%foo'")

Record.name_ends_with("foo", sensitive: false)
# => where("name ILIKE '%foo'")

Record.name_like("%foo%")
# => where("name LIKE '%foo%'")

Record.name_ilike("%foo%")
# => where("name ILIKE '%foo%'")

Boolean

Record.completed
# => where("completed = true")

Record.not_completed
# => where("completed = false")

Record.is_native
# => where("is_native = true")

Record.is_not_native
# => where("is_native = false")

Record.has_invitation
# => where("has_invitation = true")

Record.has_not_invitation
# => where("has_invitation = false")

Record.was_terminated
# => where("was_terminated = true")

Record.was_not_terminated
# => where("was_terminated = false")

Related articles