iT邦幫忙

第 11 屆 iThome 鐵人賽

DAY 12
1
自我挑戰組

Ruby and Rails 的二三事系列 第 12

Ruby and Rails 的二三事 - Day12 利用Enum設定欄位資料

  • 分享至 

  • xImage
  •  

最近在做專案,學到了用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


上一篇
Ruby on Rails 的二三事 - Day11 Gemfile
下一篇
Ruby and Rails 的二三事 - Day13 風馮諷form
系列文
Ruby and Rails 的二三事19
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言