How to remove properties of ActiveRecord scopes

When dealing with AR scopes, you can remove conditions, order, etc by using the unscope method.

It is available on Rails 4+.


Examples

Consider an exemplary User class as follows. For the examples below, we will use a scope that applies all its constraints.

class User < ActiveRecord::Base
  scope :active, -> { where(locked: false) }
  scope :admins, -> { where(role: 'admin') }
  scope :ordered, -> { order(:name) }
end

users = User.active.admins.ordered

^
SELECT "users".* FROM "users" WHERE "users"."locked" = 'f' AND "users"."role" = 'admin' ORDER BY "users"."name" ASC

Removing conditions on one column:

users.unscope(where: :role)

^
SELECT "users".* FROM "users" WHERE "users"."locked" = 'f' ORDER BY "users"."name" ASC

Removing all conditions:

users.unscope(:where)

^
SELECT "users".* FROM "users" ORDER BY "users"."name" ASC

Removing order:

users.unscope(:order)

^
SELECT "users".* FROM "users" WHERE "users"."locked" = 'f' AND "users"."role" = 'admin'


Removing all properties

You can use unscoped (with a d) to strip the scope of any constraints.

users.unscoped

^
SELECT "users".* FROM "users"

While unscope was introduced with Rails 4, the unscoped method has been around since Rails 3.

Arne Hartherz