Rails 6.1 allows enums attributes to configure the default value

Rails 6.1 introduced the ability to configure default values for enum attributes directly in the model, making it easier to set defaults without relying solely on database-level configurations.

Before Rails 6.1

Previously, enum defaults had to be configured at the database level:

# db/migrate/xxx_create_users.rb
create_table :users do |t|
  t.integer :status, default: 0
  t.timestamps
end
# app/models/user.rb
class User < ApplicationRecord
  enum status: { active: 0, inactive: 1, archived: 2 }
end

This approach worked, but it tied the default value to the database schema, making it less flexible.

Rails 6.1 Solution

Rails 6.1 allows you to configure enum defaults directly in the model:

# app/models/user.rb
class User < ApplicationRecord
  enum status: { active: 0, inactive: 1, archived: 2 }, _default: :active
end

Now when you create a new user, it will automatically have status: :active:

user = User.new
user.status # => "active"

Multiple Defaults

You can also set defaults for multiple enum attributes:

class Post < ApplicationRecord
  enum status: { draft: 0, published: 1, archived: 2 }, _default: :draft
  enum priority: { low: 0, medium: 1, high: 2 }, _default: :low
end

Benefits

Configuring enum defaults in the model provides several advantages:

  • Model-level control: Defaults are defined where they're used
  • Easier testing: No need to rely on database state
  • Better documentation: Defaults are visible in the model
  • Flexibility: Can be overridden easily when needed

Migration Considerations

When migrating to Rails 6.1, you can keep your database defaults or remove them:

# Option 1: Keep database default
create_table :users do |t|
  t.integer :status, default: 0
end

# Option 2: Remove database default, use model default
create_table :users do |t|
  t.integer :status
end

Both approaches work, but using model-level defaults gives you more flexibility.

Overriding Defaults

You can still override the default when creating records:

# Uses default
user = User.new
user.status # => "active"

# Override default
user = User.new(status: :inactive)
user.status # => "inactive"

Example: Complete Usage

class Order < ApplicationRecord
  enum status: {
    pending: 0,
    processing: 1,
    shipped: 2,
    delivered: 3,
    cancelled: 4
  }, _default: :pending

  enum payment_status: {
    unpaid: 0,
    paid: 1,
    refunded: 2
  }, _default: :unpaid
end

# Usage
order = Order.new
order.status # => "pending"
order.payment_status # => "unpaid"

order = Order.new(status: :processing, payment_status: :paid)
order.status # => "processing"
order.payment_status # => "paid"

Conclusion

Rails 6.1's enum default configuration makes it easier to define default values at the model level, providing better flexibility and maintainability. This feature simplifies enum management and makes your code more self-documenting.

Rails 6.1 allows enums attributes to configure the default value - Abhay Nikam