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.