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

>> Post.where("DATE(published_at) > DATE(?)", Date.today)
# => <ActiveRecord::Relation [...]>

>> Post.find_by("likes < ?", 10)
# => <ActiveRecord::Relation [...]>

# Following query on execution would raise exception.
>> Post.joins(:comments).where("likes > 10")
# => ambiguous column name: id

Rails 6.1.0

>> Post.where("published_at >": Date.today)
# => <ActiveRecord::Relation [...]>

>> Post.find_by("likes <": 10)
# => <ActiveRecord::Relation [...]>

# Following query on execution would NOT raise exception.
>> Post.joins(:comments).where("likes >": 10)
# => <ActiveRecord::Relation [...]>

Check out the pull request for more details on this.