DEV Community

mixbo
mixbo

Posted on

6 1

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 :)

Image of Datadog

The Essential Toolkit for Front-end Developers

Take a user-centric approach to front-end monitoring that evolves alongside increasingly complex frameworks and single-page applications.

Get The Kit

Top comments (0)

Sentry image

See why 4M developers consider Sentry, “not bad.”

Fixing code doesn’t have to be the worst part of your day. Learn how Sentry can help.

Learn more

👋 Kindness is contagious

Please leave a ❤️ or a friendly comment on this post if you found it helpful!

Okay