前幾章有提到 controller 會跟 model 拿資料,新手階段的我常常會把它跟資料庫 (Database) 搞混。
所以要特別注意以下的觀念:
Model 不是資料庫(Database)也不是資料表(Table) , Model 是一個負責跟實體的資料表溝通的抽象類別,負責跟實體的資料表溝通。
Model 其實也是一個翻譯人員,他會把 Controller 說的話翻譯成 Database 看得懂的語言 (SQL),進而在 Database 拿取我們要的資料。
上一個章節,有說明 Controller 命名慣例,在 Model 中也是一樣。
在 Rails 中, Model 的命名是單數,且字首要大寫;資料表 (table) 預設使用複數,且小寫並用底線分隔方式命名,如下:
Model | 資料表 (table) |
---|---|
User | users |
Post | Posts |
LineItem | line_item |
Mouse | mice |
介紹 CRUD 前,有些名詞是你需要知道的。
Active Record 是 MVC 的 M(Model),主要負責處理商業邏輯和資料。Active Record 負責新增與操作存在資料庫裡的資料。Active Record 本身是 ORM 系統的描述,並以 Active Record 模式實作。
Active Record 給了許多功能,以下整理幾個比較重要的:
當提到 Model 就不得不提 ORM,那 ORM 是什麼呢?
Object–relational mapping 縮寫為 ORM,中文稱“物件關係對映”。
簡單來說,就是你不用自己寫資料庫查詢語言 (SQL) 對資料庫進行查詢,可以透過 ORM 的包裝之後,以操作物件的方式來操作資料庫。例如:
User.all
透過 ORM 翻譯之後:
select * from users;
CRUD 為四個動作的名稱簡寫而來,分別為:
現在我們開始用剛剛提到的 ORM 來實作 CRUD 吧!
在開始前,先建立一個 Book 的 Model 吧!
通常我會在終端機打以下指令:
$ rails g model Book name:string content:text
這樣它會幫我定義兩個欄位:
欄位名稱 | 資料型態 | 說明 |
---|---|---|
name | 字串 (string) | 書名 |
content | 文字 (text) | 簡介 |
執行後,他會幫我製作出這些檔案:
這時,我們可以到 db/migrate/20221008144802_create_books.rb
這個檔案看一下裡有什麼:
class CreateBooks < ActiveRecord::Migration[6.1]
def change
create_table :books do |t|
t.string :name
t.text :content
t.timestamps
end
end
end
你一定會好奇,這是什麼檔案呢?
當我們建立 Model 時,Rails 會自動幫你產生出對應的 Migration
檔案,而這個檔案會幫你記錄建立 table 的過程,以及建立了哪些欄位。
到這邊還不算真正的把資料表建立出來,我們必須將 Migration
轉換成真正的表格,我們在終端機輸入:
$ rails db:migrate
這樣才真正的把資料表建立完成。
這時候,我們可以到 app/db/development.sqlite3
看到實際有的欄位:
你會發現上面除了 name 跟 content 這兩個欄位以外,還多了 id
、created_at
跟 updated_at
這三個欄位。事實上,在 Migration 檔案中的 t.timestamps ,在經過轉換之後,會產生兩個名為 created_at 跟 updated_at 的時間欄位,分別會在資料「新增」及「更新」的時候,把當下的時間寫入。
參考資料: