打造Rails App(三) — Ruby on Rails Active Record

Nathan Lee
Change or Die!
Published in
8 min readOct 14, 2017

當我們建立Rails新專案後要幹嘛?要開始進行Database的操作與互動,如何操作及互動?

我們首先要先建立Model,產生model檔案,然後遷移資料庫。接著專案中model 的一舉一動就連結著資料庫裡的資料表 (table)了,並可以透過 Active Record 提供的許多方法,同時操作專案model、也同時操作專案在資料庫中的table。

什麼是ActiveRecord?

負責管理Model與在Database中的商業物件(Business Object),便於我們對資料庫中資料及表格進行操作的Rails操作資料庫套件稱為ActiveRecord。

ActiveRecord原本是Rails架構中的其中一個元件,後來被獨立出來作為物件關聯映射(ORM)框架來使用。ActiveRecord提供了開發者簡潔扼要的語法,來消彌開發者使用資料操作語言SQL及ORM的額外負擔。同時ActiveRecord也支援了很多種資料庫系統,如MySQL、sqlite、postgres、SQL Server、Oracle。

註:ORM(Object Relational Mapping) 物件關聯映射

物件關聯映射,通常縮寫為 ORM。是一種技巧,將應用程式中複雜的物件,對應到關聯式資料庫管理系統中的資料表。使用 ORM,可以輕鬆儲存物件的特性與關係,取出來的時候也不需要撰寫 SQL 語句,總體上減少了與資料庫存取有關的程式碼。

Reference: Active Record 基礎 1.2 物件關聯映射

如何開始使用ActiveRecord操作資料庫?

若要開始進行Database的操作與互動,如何操作及互動?我們首先要先建立Model,產生model檔案。

首先要建立Model,於終端機透過下方指令在專案目錄下建立model的檔案及migration的檔案:(在此以專案photo為例)

$ rails gernerate model photo

於是產生了下方圖例中的檔案,

在app/models/ 目錄下產生了photo.rb 的檔案
在app/db/migrate 目錄下產生 20171009001433_create_photos.rb 的檔案

新增 photo model 的資料庫遷移記錄,以及 photo model 這個檔案。

photo.rb中宣告了類別Photo繼承了一個叫 ApplicationRecord 的物件

photo.rb

依據Rails命名慣例規則,在app/models目錄下找到對應檔案application_record.rb,宣告了類別ApplicationRecord繼承了ActiveRecord::Base,換句話說Photo透過繼承成為Active Record 的子類別,Photo class 取得所有 Active Record 的方法,進而成為了 Photo model。

成為 model 的意思是:Photo model 的一舉一動連結著資料庫裡一張叫 photos 的資料表 (table),你可以透過 Active Record 提供的許多方法,同時操作 Photo model、也同時操作 photos table。

Reference: Alpha camp lighthouse教材

新增 Active Record Models後要幹嘛?以 Active Record 遷移資料庫!

承上,成為model的要素提到“Photo model 的一舉一動連結著資料庫裡一張叫 photos 的資料表 (table)”,Photo model初步設置號了,接著就是處置photos的資料表(Table)了。

在建立一個 Photo model 的同時,我們也必須在資料庫裡創建一張 photos 資料表,並且透過 ActiveRecord 串連在一起。

這時後,與photo.rb一起被建立的photo model 的資料庫遷移記錄(在app/db/migrate 目錄下產生 20171009001433_create_photos.rb 的檔案)登場。

在app/db/migrate 目錄下產生 20171009001433_create_photos.rb 的檔案

create_photos.rb用於定義及宣告之後執行db:migrate時所要作的動作。

  1. 檔案內宣告了一個 類別CreatePhotos 繼承自 ActiveRecord::Migration
  2. 類別CreatePhotos下定義change,內容是該筆遷移(migration)的變動。
  3. 該例子,在程式區塊中分別指定t.stringt.datet.text等欄位,t.timestamps則會自動建立created_atupdated_at兩個欄位,每個表格也會有個自動增生的id欄位。
程式區塊中分別指定t.string、t.date、t.text等欄位

有了Migration檔案,Then?

有了Migration檔案,代表Rails已經知道該怎麼去操作資料庫了。為了執行create_photos.rb的內容以建立表格,需要執行db:migrate任務。接下來我們就執行下列指令進行Migration,

$ rails db:migrate

註:Migration中文意思是遷居到某個地方,在這邊的概念比較像是我們先描述資料庫要進行什麼樣的調整,再實際『遷移』到資料庫當中。

輸入完指令,就可以看到Rails跳出幾行訊息,說明migration的狀況。如果沒有錯誤訊息,那我們就成功的修改完資料庫了,可以進入Rails 控制台 (Console)使用以下指令進行確認,

$ rails console (進入Rails Console)
$ Photo.connection (注意第一個字母大寫)
$ exit (看完以後離開)

就可以看到我們已經在資料庫中有Photo這個table,裡面會儲存id和content這些資料。到此就完成Migration了。

每次更改資料庫,就必須Migration!

因為Migration是有先後順序的,因此有一個很重要的觀念,就是每次要更改資料庫,就必須依靠Migration,不是說改完程式碼就沒事了。若沒有migration那麼資料庫中的table是不會更動為最近一次的更動內容。反之,migration過後,上一個版本就不會再被執行了。

修改方法及細節請參照 ihower Active Record — 資料庫遷移(Migration)

以上就完成了ActiveRecord的實作,專案中model 的一舉一動就連結著資料庫裡的資料表 (table)了,並可以透過 Active Record 提供的許多方法,同時操作專案model、也同時操作專案在資料庫中的table。

ActiveRecord 功能

Photo.count     # 計算 Photo 資料數量
Photo.first # 取得第一筆
Photo.last # 取得最後一筆
Photo.find(1) # 尋找 id 為 1 的資料,沒找到的話回傳錯誤Photo.find_by(title: “xx”)# 尋找 title 為 xx 的資料,沒找到的話回傳 nil
Photo.all # 取得所有資料Photo.all.to_a# 讓資料用陣列方式呈現
Photo.size # 確認資料的數量大小Photo.sample# 隨機找出一筆資料Photo.where() # 根據條件來查找資料Photo.order()# 根據條件為資料進行排序

--

--