← Writing

Ruby on Rails: Model

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

ruby on rails

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!


參考資料

為你自己學 Ruby on Rails - Model