How to elegantly use enum in rails

ihavecoke

mixbo

Posted on June 8, 2020

How to elegantly use enum in rails

Alt Text

What is enum?

enum is data structure more simpley and readable also is a useful method can help us do more things than you thinks.

enum :status {open: 0, close: 1, unknow: -1}
Enter fullscreen mode Exit fullscreen mode

We can see status maybe open, close,unknow more readable for 0,1,-1 isn't it?

Use enum elegantly

On Rails use enum to defined select tag options is more simpley

# activity.rb
class Activity < ActiveRecordBase
  enum :status {open: 0, close: 1, unknow: -1}
end

# zh-CN.yml
zh-CN:
  active_records:
    enums:
     activity:
       open: 开启
       close: 关闭
       unknow: 未知

# en.yml
zh-CN:
  active_records:
    enums:
     activity:
       open: Opened
       close: Closed
       unknow: Unknown

# activities/_form.html.erb
<= f.select :status, Activity.status_options, {}, class:'form-control' %>
Enter fullscreen mode Exit fullscreen mode

All is done you just defined i18n for activity form add select tag to dom with options [open,close,unknow] The output

# The result 
<select class='form-control'>
  <option value='open'>开启</option>
  <option value='close'>关闭</option>
  <option value='unknow'>未知</option>
</select>
Enter fullscreen mode Exit fullscreen mode

It's too simple and elegantly

More useful API

# get enum value 0,1,-1, here status is open, close or unknow
Activity.statuses[status] #=> 0,1,-1

# opend?, close?, unknow?
activity = Activity.find(1)
activity.opend? #=> true | false
activity.close? #=> true | false

# open!
activity = Activity.find(1)
activity.open! #=> activity.update!(status: 0)
activity.close! #=> activity.update!(status: 1)

# with scopes
class Activity < ActiveRecordBase
  scope :open, ->{where(status: 0)}
  scope :close, ->{where(status: 1)}
  scope :unknow, ->{where(status: -1)}
end
Activity.open # where status = 0

# with not scope
class Activity < ActiveRecordBase
  scope :not_open, ->{where.not(status: 0)}
  scope :not_close, ->{where.not(status: 1)}
  scope :not_unknow, ->{where.not(status: -1)}
end
Activity.not_open # where status != 0
Enter fullscreen mode Exit fullscreen mode

Hope it can help you :)

💖 💪 🙅 🚩
ihavecoke
mixbo

Posted on June 8, 2020

Join Our Newsletter. No Spam, Only the good stuff.

Sign up to receive the latest update from our blog.

Related