Rails 6 adds negative scopes for all enum values
Default methods added by Enum
Rails allows adding enum
to ActiveRecord
models.
Enums allow declaring attributes, where the values map to integers in the database, but can be queried by name.
class Device < ApplicationRecord
enum status: [ :active, :disabled ]
end
# This adds some convenience methods for us to use
# device.update! status: 0
device.active!
device.active? # => true
device.status # => "active"
Along with these, Enum
also add scope and query methods on the model:
# Scope methods
Device.active #=> All active devices
Device.disabled #=> All disabled devices
# We can query the enums like so
Device.where(status: :active) #=> All active devices
These scopes though are limited to positive queries. To fetch all inactive devices, or disabled devices, we have to query like so:
Device.where.not(status: :active) #=> All inactive devices
Device.where.not(status: :disabled)#=> All devices that are not disabled
Negative scopes
Rails 6 has now added convenience methods, to query the negative enum values.
# All inactive devices
# Before
Device.where.not(status: :active)
#After
Device.not_active
# All devices that have not been disabled
# Before
Device.where.not(status: :disabled)
#After
Device.not_disabled
This gives us the ability
to use a much cleaner syntax,
rather than querying using where.not()
.