DEV Community

loading...

How to elegantly use enum in rails

ihavecoke profile image mixbo ・2 min read

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}

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' %>

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>

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

Hope it can help you :)

Discussion (0)

Forem Open with the Forem app