July 21, 2020
Rails 6.1 makes it easier to configure a default value for Active Record enum attributes.
Let's take an example of blog posts with status and category columns.
class Post < ApplicationRecord
enum status: %i[draft reviewed published]
enum category: { rails: "Rails", react: "React" }
end
Before Rails 6.1, defaults for enum attributes can be configured by applying
default
on the database level.
class AddColumnStatusToPosts < ActiveRecord::Migration[6.0]
def change
add_column :posts, :status, :integer, default: 0
add_column :posts, :category, :string, default: "Rails"
end
end
After Rails 6.1, defaults for enum attributes can be configured directly in the
Post model using _default
option.
class Post < ApplicationRecord
enum status: %i[draft reviewed published], _default: "draft"
enum category: { rails: "Rails", react: "React" }, _default: "Rails"
end
The new approach to set enum defaults has following advantages. Let's understand keeping the context of Post model with category as an example.
Rails
to React
. We have to
add a new migration in Rails 6 and previous versions to update the database
column default.Rails
) is removed from the
enum from Post model. Rails 6 and previous versions wouldn't throw an
exception and continue to work without setting any default value. Rails 6.1
with new syntax would raise an exception.Check out the pull request for more details on this.
If this blog was helpful, check out our full blog archive.