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.