A Simple Guide to Enum’s with Rails

black and white dappled light on leaves

What

An enum is a special data type that allows you to declare and query data with string variables but stores an integer in the database. You can think of an enum as being able to set a variable to a value (for Ruby on Rails, its an integer value). For example, if you want a status column in your database model, you could set the status to enum type and store your possible statuses started, in progress, and complete, as 0, 1, and 2.

Why

Not only does this let developers write more semantic code, but it’s also more space-efficient, less bug-prone, and easy to update down the road!

When

I like to think of an enum as a combination of a boolean and a string. If you have an attribute that has a finite number of possible values, that will likely have to be updated, this could be a good place to use an enum. Here are some examples:

  • Direction enum (north: 0, south: 1, east: 2, west: 3)
  • Suit enum (hearts: 0, spades: 1, diamonds: 2, clubs: 3)

How

In Ruby on Rails

Setting up an enum

  1. Set up your model with the enum attribute set to an integer
rails g model Task description:string status:integer
class Task < ActiveRecord::Base
enum status: [ :not_started, :in_progress, :complete ]
end
class Task < ActiveRecord::Base
enum status: {in_progress: 1 , complete: 2, not_started: 0 }
end
// both ways set "not_started" = 0, "in_progress" = 1, "complete" = // 2

Working with an enum

  • Declare or change attributes using the string, the int, even a bang
> task.status = 1; task.status
=> "in_progress"
> task.status = "in_progress"; task.status
=> "in_progress"
> task.in_progress!
=> true
> task.status
=> "in_progress"
> task.status
=> "in_progress"
> task.first.in_progress?
=> true
> Task.in_progress
TaskLoad (0.3ms) SELECT "tasks".* FROM "tasks" WHERE "taskes"."status" = ? [["status", 1]]
// ../form.html.erb<div class="field">
<%= f.label :status %><br>
<%= f.select :status, Phone.status.keys %>
</div>

Full-Stack Software Engineer, Designer, and salsa dancer.