Rails 5 allows to use or
operator when building Active Record queries.
Article.where(id: 9)
.or(Article.where(title: 'Rails 5: OR operator in Active Record'))
The query above returns a union of two relations specified. Those relations must
be structurally compatible: they must use the same model and set parameters via
WHERE
or HAVING
. Additionally, none of the relations can use .limit()
,
.offset()
or .distinct()
functions.
This Active Record query is converted to the following SQL query.
SELECT "articles".* FROM "articles"
WHERE (
"articles"."id" = ?
OR
"articles"."title" = ?)
[
["id", 9],
["title", "Rails 5: OR operator in Active Record"]
]
or
operator can be combined with group
and having
queries.
articles = Article.group(:author_id)
articles.having('id > 8')
.or(articles.having('title like "Rails 5%"'))
This Active Record query is converte to the following SQL query.
SELECT "articles".*
FROM "articles"
GROUP BY "articles"."author_id"
HAVING ((id > 8) OR (title like "Rails 5%"))
or
operator can be combined with existing scopes
class Article < ApplicationRecord
scope :published, -> { where(published: true) }
end
Article.published
.or(Article.where('id > 8'))
or
operator can be also used to combine two or more scopes togther
class Article < ApplicationRecord
scope :status, -> (value) { where(status: value) }
scope :published, -> { where(accepted: true) }
scope :ready, -> { status("accepted").or(published) }
end