開始跟Rails ActiveRecord當好朋友

Adler @ 2014-10-19


db

開啟新的Rails專案以後,第一步就是要資料庫操作開始,也就是產生model檔案。(啥?你不需要用資料庫?那用Rails幹嘛?)本篇簡單說明Rails當中基本的資料庫概念。

1. 為什麼Rails需要使用資料庫?

假如今天我們要儲存部落格所有的post,用.html或.rb檔案來儲存在專案資料夾中,未來這些所有post還要依照開發者的需求來查閱、排序、修改,如果都用文字搜尋的方法來查找,是極其沒有效率的。

因此我們需要一個專門管理資料的系統,讓我們方便對所有資料進行操作,資料庫裡面是各種表格,就像一堆excel的表格一樣,有了這樣的架構,要查找就方便多了!

如果你真的對資料庫一點概念都沒有,建議可以在下方延伸閱讀或是Wiki、Google上大概了解資料庫的意義及目的。

2. Rails的資料庫在哪?

首先要先知道幾件事情:

  1. Rails專案資料夾內並不會有『資料庫』這個東西(sqlite除外)。
  2. 如果在安裝Rails過程中有安裝過sqlite和mysql,這些套件會去連接系統的資料庫。
  3. Rails操作資料庫的套件稱為ActiveRecord,而寫入的方式稱為Migration。

如果Rails專案和資料庫是分開的,那如果在本機開發,最後佈署到伺服器上,資料庫的內容會一起佈署過去嗎?答案是不會,因為資料庫是裝在自己的電腦上,如果要一起佈署過去,必須從資料庫裡面複製資料出來,copy到伺服器上的資料庫內,這跟Rails本身就比較沒有關係了。

3. 如何開始操作資料庫?

當我們開始Rails專案開發時,都會先設定一個model,並與資料庫連結產生一個table可供儲存、讀取。通常我們會在command line中輸入:

$ rails generagte model post content:text

這樣子我們就產生了一個叫做post的model,另外也產生了一個migration檔案。我們可以到db/migrate資料夾底下找到這些檔案,打開以後會看到:

假如跟Rails不太熟悉,這個畫面其實還不太需要了解細節,但主要要知道,這個檔案就是在描述資料庫內要執行的內容。例如裡面使用了create_table這個指令,意思是他要在資料庫中建立一個table叫做posts,就像在excel裡面開一個新的空白表格一樣,用來儲存資料。

4. 如何進行Migration?

有了Migration檔案,代表Rails已經知道該怎麼去操作資料庫了,接下來我們就可以進行Migration。

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

在command line輸入:

$ rake db:migrate

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

$ rails console
$ Post.inspect (注意第一個字母大寫)
$ exit (看完以後離開)

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

5. Migration的順序

Rails是依照步驟來對資料庫進行操作,已經執行過的Migration就不會再執行。例如現在我們有7個Migration檔案如下:

migrate資料夾當中的所有檔案都是Migration檔案。我們可以利用以下指令新增另一個Migration檔案:

$  rails generate migration add_index_to_posts

(migration名稱後方的字串可自由命名)

這個Migration就會是第8個Migration檔案,也就是說假如我們再執行一次$ rake db:migrate那Rails只會執行這第8個檔案,其他先前已經執行過的就不會再執行。

6. Migration的修改

因為Migration是有順序的,因此有一個很重要的部份,就是每次要更改資料庫,就必須依靠Migration,不是說改完程式碼就沒事了。

例如在執行完rake db:migrate指令以後才發現欄位名稱寫錯了,要重跑一次,要怎麼做呢?資料庫的操作與一般修改程式不同,一般我們只要回去程式碼上修改,再執行一次就可以了。但Rails資料庫的操作必須是:

  1. $ rake db:rollback (倒車,回到剛剛的狀態)
  2. 修改程式碼
  3. $ rake db:migrate (重新進行一次migrate)

假如有一個已經老早就執行過的Migration要修改,就一定要先倒車回到當時尚未migrate的狀況,修改以後再進行migrate。如果真的要倒車到很久以前去修改...那還是開一個新的Migration檔案來改吧~

7. 利用schema.rb觀看資料庫全貌

所有Migration完成以後都會更新一次schema.rb這個檔案,裡面描述整個資料庫的table和欄位狀況,不管我們的Migration是在哪一個階段,都可以到這個schema.rb檔案當中了解目前資料庫的整體模樣。

為什麼需要這個檔案呢?因為每次Migration的檔案都只會紀錄片面的增加、修改、刪除指令,沒辦法看到完整的全貌。如果這個專案需要請人來接手,其他人就可以透過這個schema.rb檔案來檢視資料庫目前的樣貌。

因此,一般來說不會需要更動這個檔案,讓他自動更新即可。

延伸閱讀

資料庫說明

ActiveRecord: 資料表操作