打造Rails App(三) — Ruby on Rails Active Record
當我們建立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
於是產生了下方圖例中的檔案,
新增 photo model 的資料庫遷移記錄,以及 photo model 這個檔案。
photo.rb中宣告了類別Photo繼承了一個叫 ApplicationRecord 的物件。
依據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 的檔案)登場。
create_photos.rb用於定義及宣告之後執行db:migrate時所要作的動作。
- 檔案內宣告了一個 類別
CreatePhotos
繼承自ActiveRecord::Migration
。 - 類別
CreatePhotos
下定義change
,內容是該筆遷移(migration)的變動。 - 該例子,在程式區塊中分別指定
t.string
、t.date
、t.text
等欄位,t.timestamps
則會自動建立created_at
與updated_at
兩個欄位,每個表格也會有個自動增生的id欄位。
有了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()# 根據條件為資料進行排序