DEV Community

mixbo
mixbo

Posted on

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

Top comments (0)