iT邦幫忙

第 11 屆 iThome 鐵人賽

DAY 20
1
自我挑戰組

毫無基礎學習 Ruby on Rails 的 甘苦心得系列 第 20

DAY 20 什麼是 model migration??

  • 分享至 

  • xImage
  •  

MVC 的 M(Model), 負責新增與操作需要持久存在資料庫裡的資料

它不是資料庫也不是資料表,而是負責跟實體的資料表進行溝通。

他有點像是翻譯機,你跟翻譯機說人話,他會把人話轉換成資料庫的語言,然後跟他要資料。

命名規則:

單複數轉換機制很強大,能單轉複數、複轉單,連不規則轉換都能正確處理。

Model 名稱同樣遵循 Ruby 慣例,採駝峰式命名,而資料表名稱必須採用底線分隔。

https://ithelp.ithome.com.tw/upload/images/20191004/20118842DlnxTkEtwr.png

使用rails generate建立model
透過 rails generate 指令產生 Model

rails g model User name:string age:integer gender:text

指令是會建立一個 User的 model 裡面的欄位有 name age gender 這三個,提醒一下 因為工程師本身非常懶,欄位預設值是string,如果你的欄位性質是string的話 可以省略不寫,會變成這樣(generate也可以簡寫成 g喔喔喔~~)

rails g model User name age:integer gender

https://ithelp.ithome.com.tw/upload/images/20191004/20118842MSF1TZGIhN.png

可以看到active_record自動幫你建立的兩個檔案:

db/migrate/20191004025500_create_users.rb

app/models/user.rb

先來看一下app/models/user.rb

可以看到Rails自動幫你在models裡面新增了User的class,表示可以用 User.new 來建立新的物件

你也可以在這邊建立類別方法/或是資料驗證等等

https://ithelp.ithome.com.tw/upload/images/20191004/20118842H1dpmwzKkE.png

接著我們來看 migrate/20191004025500_create_users.rb 這檔案裡面的內容

它自動幫你建立一個CreateUsers的class

裡面使用create_table 幫每個user建立剛剛帶入的key

https://ithelp.ithome.com.tw/upload/images/20191004/20118842F4Y4UGqocB.png

那什麼是Migration?

剛剛建立的 20191004025500_create_users.rb 其實就是

Migration 是用來描述「資料庫的架構長什麼樣子」的檔案

那為什麼要這樣做呢?

Migration檔案把新增修改刪除更名的紀錄都記下來,透過Git共同開發,每個人都可以拿到同樣的Migration檔案,可以同步資料庫結構;在Git上也可以將整個資料庫的設計過程一目了然。

接著

只要一個執令db:migrate就可以建立資料庫的結構
這時候必須執行db:migrate,Rails才會根據/db/migrate/裡面的檔案產出資料庫
你可以把 db:migrate 視為具現化的指令

$ rake db:migrate        #table具現化/rails2.4版本指令
$ rails db:migrate       #rails2.6指令

這時就可以到 db/schema.rb 查看資料表是否建立成功

https://ithelp.ithome.com.tw/upload/images/20191004/20118842Cz5pc68KaF.png

想要新增欄位(key)或打錯字怎麼辦?

我當初在接觸model這塊的時候,以為我要新增欄位 或刪除欄位只要在migration做增加刪除就可以了,但我錯了,因為db:migrate指令只對沒有執行過的Migration檔案有效果,所以單純在檔案中加入key名稱在重新db:migrate是沒有效的,解決辦法:

rollback

這樣就可以「倒轉」一個 Migration

$ rails db:rollback.  #倒 退drop_table,有風險!!整張表格丟掉的意思

如果一次想要倒轉 2 個 Migration,可以加上 STEP=2 參數:

$ rails db:rollback STEP=2

但這種方法不建議這樣做,因為 你如果 table 有資料的話 盡量不要使用 Rollback ,建議直接再新增一個 Migration 來進行修正。

再新增一個migration描述檔來做migration

rails g migration add_email_column_to_users

增加migration的時候 名稱最好是可以表達 是要做什麼用途的,上面例子 建立一個 email的欄位

https://ithelp.ithome.com.tw/upload/images/20191004/20118842Lr2Hfp3JXE.png

接著就可以在裡面填入要增加的欄位名稱跟資料囉 範例如下

https://ithelp.ithome.com.tw/upload/images/20191004/20118842CgzoLaIgVj.png
add_column方法,可以為:users這個資料表,新增:email欄位,並以string當作資料結構

Active Record - 資料庫遷移(Migration)

https://ithelp.ithome.com.tw/upload/images/20191004/20118842sKuVA0SzpZ.png


上一篇
DAY 19 action view
下一篇
DAY 21 Git Flow 是什麼?為什麼需要這種東西?
系列文
毫無基礎學習 Ruby on Rails 的 甘苦心得30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言