samuil
samuil

Reputation: 5081

Disjunction in ActiveRecord

Is it possible to use ActiveRecord named_scopes to create one query with sql OR clauses?

When I use

Model.scope1.scope2

generated query is conjunction of these scopes.

Upvotes: 2

Views: 668

Answers (2)

Arthur Andersen
Arthur Andersen

Reputation: 346

I reply as this was the first google result for "active record disjunction".

With Rails 5+ you can do something like:

Model.scope1.or(Model.scope2)

For Rails 4.2.3+ there is a backport here.

Eric-Guo created a gem where-or adding or functionality to rails >= 4.2.3 also using his gem.

Upvotes: 1

Peter Brown
Peter Brown

Reputation: 51697

This isn't really what named scopes were designed to do, but you could probably use them with some additional code to get what you needed.

def combine_scopes(model)
  (model.scope1 + model.scope2).uniq
end

or allow any scopes to be combined

def combine_scopes(model, scope1, scope2)
  (model.send(scope1) + model.send(scope2)).uniq
end

you could even change that to allow any number of scopes using *args

Upvotes: 0

Related Questions