ActiveRecord::Enum
目的
宣告文字用來說明欄位中數字的意義,以下介紹兩種方式,也可順便解釋使用enum 的好處
假設Conversation 有個status 的欄位,建立常數,使用Hash 表示 0、1,分別代表active、archived
w/o Enum
1
2
3
4
5
6
  | module Conversation
  STATUS = { 0 => "active", 1 => "archived" }
end
conversation = Conversation.last
STATUS[conversation.status] # active or archived
  | 
 
w/ Enum
官方建議:欄位必須建立預設值
1
2
3
4
5
6
  | class Conversation < ActiveRecord::Base
  enum status: {
    active: 0,
    archived: 1
  }
end
  | 
 
查看總共有哪些狀態(名字加複數)
1
2
  | Conversation.statuses
# { "active"=>0, "archived"=>1 }
  | 
 
查看目前狀態
1
2
3
  | conversation = Conversation.last
conversatino.active!
conversation.status # active
  | 
 
變更欄位狀態
1
2
3
  | conversation = Conversation.last
conversatino.archived!
conversatino.archived?  #true
  | 
 
查詢是否為此狀態
1
2
3
4
  | conversation = Conversation.last
conversatino.active!
conversatino.active?    #true
conversatino.archived?  #false
  | 
 
當作where 查詢條件
1
  | Conversation.where(status: [:active, :archived])
  | 
 
加入_prefix
1
2
3
4
5
6
  | class Conversation < ActiveRecord::Base
  enum comments_status: [:active, :inactive], _prefix: :comments
end
conversation.comments_inactive!
conversation.comments_active? # => false
  | 
 
加入_suffix
1
2
3
4
5
6
  | class Conversation < ActiveRecord::Base
  enum status: [:active, :archived], _suffix: true
end
conversation.active_status!
conversation.archived_status? # => false
  | 
 
轉成陣列 (options_for_select)
1
  | Conversation.statuses.invert.to_a # [[0, "active"], [1, "archived"]]
  | 
 
優點
- database 仍儲存數字代碼,查詢速度較快
 
- 程式部分仍可以使用文字方式開發,提高閱讀性
 
Reference