iT邦幫忙

第 12 屆 iT 邦幫忙鐵人賽

DAY 16
0
Modern Web

Ruby on Rails面試題挑戰系列 第 16

Ruby on Rails面試題挑戰 Day16 - Rails怎麼管理資料庫狀態?

昨天談到了Active Record的基本介紹,知道了Active Record是一種設計模式,應用到了ORM技術,將程式語言中的物件對應到了資料庫中的資料表,而Rails中的Model就是依照Active Record所設計出來的產物。再來深入了解有關Active Record的面試題吧!

How does Rails manage database state?
Rails怎麼管理資料庫狀態?


要回答這個問題,首先得搞清楚什麼是資料庫狀態(database state)。

資料庫狀態是什麼?

資料庫狀態(database state)是指某個時刻當時的資料庫內容,進入、修改、刪除資訊都會改變資料庫狀態。

那Rails又是如果管理的呢?

Migration

Rails提供了一種方式叫migration來管理資料庫,可以想像成每一個migration都是一個新的資料庫版本,一開始資料庫什麼都沒有,藉由每一個migration檔案增加或刪除資料表、欄位等等。

這樣一來,Active Record就可以根據migration的先後順序知道要如何更新你的資料庫到最新的版本。

以下是一個migration檔案的範例

class CreateProducts < ActiveRecord::Migration[5.0]
  def change
    create_table :products do |t|
      t.string :name
      t.text :description
 
      t.timestamps
    end
  end
end

這個migration檔,會創造一個products資料表,裡面有一個string的欄位是name和一個text欄位叫做description。另外還會有一個內建的欄位id來記錄流水編號,timestamps還會幫我們多加兩個欄位created atupdated at分別紀錄資料寫入與更新的時間。

假設資料庫裡一開始什麼都沒有,那當我們執行rails db:migrate後,就會生成上述的資料表與欄位,同時migration也支持倒退的行為,輸入rails db:rollback,就會將最新的migration退回,不過這招要小心使用,不要在已經跑好一段時間欄位與資料用這招,另外新增一個migration來處理會是更好的方式。

上面這一個migration是不分資料庫類型的,不管是MySQL、PostgreSQL、 Oracle或其他都是可以正常運作的。

這些migration檔案提供了Active Record指引,讓它知道如何去修改現有的資料庫,也因為如此,非常不建議去刪除或修改之前的migration檔案,常會使資料庫出問題。

Model 與 Migration

當我們Rails中要產生一個Model時,會輸入像以下的指令

$ rails generate model Product name:string description:text

除了產生Product這個model外,Rails也會很貼心的幫我們生成一個對應的migration檔。

class CreateProducts < ActiveRecord::Migration[5.0]
  def change
    create_table :products do |t|
      t.string :name
      t.text :description
 
      t.timestamps
    end
  end
end

而當我們跑下rails db:migrate後,我們的資料庫會生成products資料表對應到Product這個Class(或說Model),而當我們Product 這個Class製造(create)一個實體(物件)時,資料表也同時會寫入一筆資料,這就是Active Record幫我們做的好事。

這樣有沒有對於Active Record與migration之間的關係更加清楚了呢,明天來持續相關的面試題吧。

你可以這樣回答:

Rails提供了一種很方便的方法叫做migration來改變資料庫狀態。開發者靠著migration來指引Active Record如何修改現有的資料庫,增加或刪除資料表、欄位等等。

參考資料

1.Wiki - Database state

2.Rubyguide-ActiveRecord_Migration

2.Rubyguide-ActiveRecord


上一篇
Ruby on Rails面試題挑戰 Day15 - Active Record是什麼?
下一篇
Ruby on Rails面試題挑戰 Day17 - 什麼是Callback?
系列文
Ruby on Rails面試題挑戰30

尚未有邦友留言

立即登入留言