最近在做專案,學到了用Enum來設定欄位資料的方式,就順手紀錄一下吧!
Enum 讓我們在設定資料表的欄位時,可以用Integer,而不是用String來儲存。
感受不出有什麼好處嗎?
讓我們來個小劇場吧!˙
對新手來說,當我們想建立一個 Model User,而且希望裡面有名字(name)和角色(role)時:
名字(name)不用說,當然是用字串來存放,那角色(role)呢?
如果有現在有角色總共可以分成: admin, teacher, student;
姆...看起來應該也是字串吧?
於是乎你建立的 migration 檔,大概會是長這樣:
class CreateUsers < ActiveRecord::Migration[5.2]
def change
create_table :users do |t|
t.string :name
t.string :role
t.timestamps
end
end
end
上面這種做法是完全OK的,只是遇到狀況的時候會比較麻煩一點;
比如說,今天如果有人在建立資料的時候打錯字,
像是 abmin, teather, studant,
而資料也一時不察的被寫進資料庫!那就尷尬了...
為了避免這種狀況,Rails提供Enum這個方法來解決上述的問題。
首先,你要使用Enum設定的欄位值,必須要是Integer,
所以,先來建立一個migration檔修改欄位吧!
class ChangeRoleToIntegerInUsers < ActiveRecord::Migration[5.2]
def change
change_column :users, :role, :integer
end
end
接著,只要在Model底下User.rb檔裡,像下面這樣去修改
class User < ApplicationRecord
#加入下面這行
enum role: { admin: 0, teacher: 1, student:2 }
#或是你也可以寫成這樣
#enum role: [ :admin, :teacher, :student ]
end
搭拉!兩三下就完成啦!!
如此一來,當我們在更新或是建立資料時,就多了許多方法可以用囉!
以rails console為例:
u1 = User.find(1)
u1.update(role: 1)
u1.role
=> teacher
不只是這樣而已,你還可以這樣用:
u1.teacher?
=> true
u1.admin!
u1.teacher?
=> false
u1.role
=> admin
泥砍砍,泥砍砍,是不是很方便很好用!
那麼今天的鐵人賽就先這樣啦!繼續趕專題去...ORZ