Ruby on Rails: Model
before_action :複習基礎知識 Route, Controller, View, Model, Migration 這裡我們來把 Route, Controller, View 扮演的角色再複習一次, 並加上 Model, Migration 為整個架構在理解的更透徹! 在 CRUD 實...
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 用於管理資料庫結構變更的工具。
Migration 是定義資料庫結構的版本控制,提供一種便捷的方式來新增、修改或刪除資料表、欄位、索引等。每個 Migration 文件都包含一些操作,用於改變資料庫結構,例如新增欄位、修改欄位類型、建立關聯等。Migration 可以跟蹤和管理資料庫結構的變化,並在不影響資料完整性的情況下進行更新。
ORM
ORM 是 Object Relational Mapping 的縮寫,中文翻譯為物件關聯映射。 Rails 的 ORM 機制會將 Model 與資料庫表格進行映射, 讓我們可以通過操作 Model 來操作資料庫表格中的資料。 這使得資料庫操作更加直觀和方便,可以直接使用 Ruby 語法來操作資料庫, 而不需要使用 SQL 語句。
理解基本觀念,接著來看看建立 Model 之後的樣子吧!
建立 Model
命名慣例:Model 的命名是單數
# original
rails generate model Article title:string content:text
# simplify
rails g model Article title content:text
透過上述指令,會生成一個名為 Article 的 Model, 並在資料庫中建立一個名為 articles 的資料表(table), 該資料表包含 title 和 content 兩個欄位,分別是 string 和 text 型別。
app/models/article.rb
class Article < ApplicationRecord
validates :title, presence: true # 驗證 title 欄位必填
end
在剛剛的指令中也會同時生成一個 Migration 檔案,用於建立資料庫中的相應資料表,
檔名會包含時間戳記和表名的相關資訊,且包含 create_table 方法,用於定義資料表的結構。
db/migrate/20230713042828_create_articles.rb
class CreateArticles < ActiveRecord::Migration[7.0]
def change
create_table :articles do |t|
t.string :title
t.text :content
t.timestamps
# t.datetime :created_at
# t.datetime :updated_at # 可以思考這個欄位有無需要更新時間功能
end
end
end
確認資料表欄位都符合自己的需求時,要執行 rails db:migrate
才會真正在資料庫中建立相應的資料表!
沒執行就會看到錯誤訊息:ActiveRecord::PendingMigrationError!
Table 資料表
在執行 rails db:migrate 後,資料表便隨之產生,
在 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 參數:
class CreateArticles < ActiveRecord::Migration[7.0]
def change
create_table :articles, id: false do |t| # id: false
t.string :title
t.text :content
t.timestamps
end
end
end
如果想在 Model 再多新增欄位呢?
想要在既有的 Model 內,再新增欄位的話, 透過 rails g migration add_subtitle_to_article 新增一個 migration 之後, 藉由新生成的 migration,加上 add_column 方法, 就可以對之前有建立的 Model (Article) 新增欄位!
class AddSubtitleToArticle < ActiveRecord::Migration[7.0]
def change
add_column :articles, :sub_title, :string
end
end
接著再次 rails db:migrate 後,就可以發現資料庫裡面新增了 sub_title 欄位了!
Summary
簡單說明 Model 的基本知識以及 Mogration 在產生資料表會有的欄位, 下一章會繼續說明重點中的重點! Model的關聯性! 請詳見 Viiisit Ruby on Rails - Relationships of Models!