Latest changes in Rails 7 introduces new syntax for defining an enum.
Before
The previous syntax includes the key value pair for the enum name, its enum values, and the options.
class Post < ActiveRecord::Base
enum status: [ :draft, :published, :archived ], _prefix: true, _scopes: false
enum category: [ :free, :premium ], _suffix: true, _default: :free
end
After
The new syntax has made the enum name and the values a separate argument and the enum options can be passed as key value pairs.
class Post < ActiveRecord::Base
enum :status, [ :draft, :published, :archived ], prefix: true, scopes: false
enum :category, [ :free, :premium ], suffix: true, default: :free
end
These changes also work with the hash syntax.
class Post < ActiveRecord::Base
enum :status, { draft: 0, published: 1, archived: 2 }, prefix: true, scopes: false
enum :category, { free: 0, premium: 1 }, suffix: true, default: :free
end
The following instance methods will be generated by rails as usual and there are no changes here:
status_draft?
status_draft!
status_published?
status_published!
status_archived?
status_archived!
free_category?
free_category!
premium_category?
premium_category!
The following scopes will also be created
free_category
premium_category
Note that the scopes for status
won’t be created as we have provided scopes: false
.
Notice the changes in the option keys:
Old Option | New Option |
---|---|
_default |
default |
_prefix |
prefix |
_suffix |
suffix |
_scopes |
scopes |
Note: The previous syntax will keep working until it is deprecated.