MVC 的 M(Model), 負責新增與操作需要持久存在資料庫裡的資料
它不是資料庫也不是資料表,而是負責跟實體的資料表進行溝通。
他有點像是翻譯機,你跟翻譯機說人話,他會把人話轉換成資料庫的語言,然後跟他要資料。
命名規則:
單複數轉換機制很強大,能單轉複數、複轉單,連不規則轉換都能正確處理。
Model 名稱同樣遵循 Ruby 慣例,採駝峰式命名,而資料表名稱必須採用底線分隔。
使用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
可以看到active_record自動幫你建立的兩個檔案:
db/migrate/20191004025500_create_users.rb
app/models/user.rb
先來看一下app/models/user.rb
可以看到Rails自動幫你在models裡面新增了User的class,表示可以用 User.new 來建立新的物件
你也可以在這邊建立類別方法/或是資料驗證等等
接著我們來看 migrate/20191004025500_create_users.rb 這檔案裡面的內容
它自動幫你建立一個CreateUsers的class
裡面使用create_table 幫每個user建立剛剛帶入的key
那什麼是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 查看資料表是否建立成功
想要新增欄位(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的欄位
接著就可以在裡面填入要增加的欄位名稱跟資料囉 範例如下
add_column方法,可以為:users這個資料表,新增:email欄位,並以string當作資料結構
Active Record - 資料庫遷移(Migration)