Rails 6.1 adds support for where with a comparison operator

Abhay Nikam

Abhay Nikam

July 14, 2020

Please note that the PR discussed in this blog was reverted.

Rails 6.1 adds support to comparison operator in the where clause. The four comparison operators supported are:

  • Greater than (>).
  • Greater than equal to (>=).
  • Less than (<).
  • Less than equal to (<=).

The comparison operator is also supported by the finder methods in ActiveRecord which internally uses where clause, for example: find_by, destroy_by, delete_by.

The new style for comparisons has to follow advantages:

  • The where clause with the comparison operator doesn't raise an exception when ActiveRecord::Relation uses ambiguous column name.
  • The where clause with the comparison operator handle proper precision of the database columns.

Before Rails 6.1, to add a condition with comparison in where clause, we had to add raw SQL notation.

Rails 6.0.0

1>> Post.where("DATE(published_at) > DATE(?)", Date.today)
2# => <ActiveRecord::Relation [...]>
3
4>> Post.find_by("likes < ?", 10)
5# => <ActiveRecord::Relation [...]>
6
7# Following query on execution would raise exception.
8>> Post.joins(:comments).where("likes > 10")
9# => ambiguous column name: id

Rails 6.1.0

1>> Post.where("published_at >": Date.today)
2# => <ActiveRecord::Relation [...]>
3
4>> Post.find_by("likes <": 10)
5# => <ActiveRecord::Relation [...]>
6
7# Following query on execution would NOT raise exception.
8>> Post.joins(:comments).where("likes >": 10)
9# => <ActiveRecord::Relation [...]>

Check out the pull request for more details on this.

If this blog was helpful, check out our full blog archive.

Stay up to date with our blogs.

Subscribe to receive email notifications for new blog posts.