before_action :複習基礎知識
Route, Controller, View, Model, Migration
這裡我們來把 Route, Controller, View 扮演的角色再複習一次,
並加上 Model, Migration 為整個架構在理解的更透徹!
在 CRUD 實作裡,最常接觸的就是 Route, Controller, View, Model, Migration,
以下是他們的作用:
Route 定義應用程式路徑,將特定的 URL 導向相應的
controller#action
。View 呈現資料和生成用戶界面 -> 顯示資料給使用者,以及收集和顯示表單數據。
Controller 處理 route 請求,協調 model, view 之間的交互作用。
接收來自用戶的請求,檢索或修改資料,然後將資料傳遞給 view 進行呈現。Model 像是翻譯蒟蒻,負責跟實體的資料表溝通。
Migration 用於管理資料庫結構變更的工具。
Remark: Migration 是定義資料庫結構的版本控制,提供一種便捷的方式來新增、修改或刪除資料表、欄位、索引等。 每個 Migration 文件都包含一些操作,用於改變資料庫結構,例如新增欄位、修改欄位類型、建立關聯等。 Migration 可以跟蹤和管理資料庫結構的變化,並在不影響資料完整性的情況下進行更新。
ORM
ORM 是 Object Relational Mapping 的縮寫,中文翻譯為物件關聯映射。
Rails 的 ORM 機制會將 Model 與資料庫表格進行映射,
讓我們可以通過操作 Model 來操作資料庫表格中的資料。
這使得資料庫操作更加直觀和方便,可以直接使用 Ruby 語法來操作資料庫,
而不需要使用 SQL 語句。
理解基本觀念,接著來看看建立 Model 之後的樣子吧!
建立 Model
命名慣例:Model 的命名是單數
1 | # original |
透過上述指令,會生成一個名為 Article 的 Model,
並在資料庫中建立一個名為 articles 的資料表(table),
該資料表包含 title 和 content 兩個欄位,分別是 string 和 text 型別。
app/models/article.rb
1 | class Article < ApplicationRecord |
在剛剛的指令中也會同時生成一個 Migration 檔案,用於建立資料庫中的相應資料表,
檔名會包含時間戳記和表名的相關資訊,且包含 create_table
方法,用於定義資料表的結構。
db/migrate/20230713042828_create_articles.rb
1 | class CreateArticles < ActiveRecord::Migration[7.0] |
確認資料表欄位都符合自己的需求時,要執行 rails db:migrate
才會真正在資料庫中建立相應的資料表!
沒執行就會看到錯誤訊息:ActiveRecord::PendingMigrationError
!
Table 資料表
在執行 rails db:migrate
後,資料表便隨之產生,
Remark:
在 VSCode 安裝一個 Extension,叫做 SQLite Viewer,方便去查看我的資料表以及欄位。
可以料想到資料表會有 title 與 content 兩個欄位,但實際打開資料表會發現,
多了 id、created_at 跟 updated_at 這三個欄位。
其實在 Migration 檔案中的 t.timestamps,會產生 created_at 跟 updated_at 的時間欄位,分別會在資料「新增」及「更新」的時候,把當下的時間寫入,所以在 Rails 專案中處理資料的時候,大多不太需要煩惱時間的問題。
id 欄位是 Rails 自動幫每個資料表加的流水編號欄位,
這個欄位稱為資料表的主鍵(Primary Key)。
如果你不想要這個主鍵,可以在 Migration 加上 id: false 參數:
1 | class CreateArticles < ActiveRecord::Migration[7.0] |
如果想在 Model 再多新增欄位呢?
想要在既有的 Model 內,再新增欄位的話,
透過 rails g migration add_subtitle_to_article 新增一個 migration 之後,
藉由新生成的 migration,加上 add_column 方法,
就可以對之前有建立的 Model (Article) 新增欄位!
1 | class AddSubtitleToArticle < ActiveRecord::Migration[7.0] |
接著再次 rails db:migrate 後,就可以發現資料庫裡面新增了 sub_title 欄位了!
Summary
簡單說明 Model 的基本知識以及 Mogration 在產生資料表會有的欄位,
下一章會繼續說明重點中的重點! Model的關聯性!
請詳見 Viiisit Ruby on Rails - Relationships of Models!
參考資料:
➫ 為你自己學 Ruby on Rails - Model