July 16, 2023

Viiisit [Ruby on Rails] - Model!

#ruby on rails

before_action :複習基礎知識

Route, Controller, View, Model, Migration

這裡我們來把 Route, Controller, View 扮演的角色再複習一次,
並加上 Model, Migration 為整個架構在理解的更透徹!

在 CRUD 實作裡,最常接觸的就是 Route, Controller, View, Model, Migration,
以下是他們的作用:

ORM

ORM 是 Object Relational Mapping 的縮寫,中文翻譯為物件關聯映射。
Rails 的 ORM 機制會將 Model 與資料庫表格進行映射,
讓我們可以通過操作 Model 來操作資料庫表格中的資料。
這使得資料庫操作更加直觀和方便,可以直接使用 Ruby 語法來操作資料庫,
而不需要使用 SQL 語句。

理解基本觀念,接著來看看建立 Model 之後的樣子吧!


建立 Model

命名慣例:Model 的命名是單數

1
2
3
4
# 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

1
2
3
class Article < ApplicationRecord
validates :title, presence: true # 驗證 title 欄位必填
end

在剛剛的指令中也會同時生成一個 Migration 檔案,用於建立資料庫中的相應資料表,
檔名會包含時間戳記和表名的相關資訊,且包含 create_table 方法,用於定義資料表的結構。

db/migrate/20230713042828_create_articles.rb

1
2
3
4
5
6
7
8
9
10
11
12
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 後,資料表便隨之產生,

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
2
3
4
5
6
7
8
9
10
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) 新增欄位!

1
2
3
4
5
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!


參考資料:
為你自己學 Ruby on Rails - Model