iT邦幫忙

第 11 屆 iThome 鐵人賽

DAY 14
0

資料遷移(Migration)是很多剛接觸 Rails 的一定要學習且最容易出問題的地方,我在接觸這塊時,對 Migration 常見的誤解有:

  • Migration 就是資料庫。
  • 只要在 Migration 修改欄位後,網頁上自動就會呈現修改後的效果。
  • 如果 Migration 寫錯,只要修改後再重新執行 rails db:migrate 指令就行了。

新增 Migration:
要產生一個 migration 檔案,有三種方式:

  • rails generate 產生一個 Model 檔案。
  • rails generate 產生一個 Scaffold 檔案。
  • rails generate 產生一個 migration 檔案 (在已有的資料表內,新增或修改欄位)。

在終端機輸入 rails g CreateCustomReport name table preferences:text user:references customer:references

這是會產生一個 Migration 檔案:

class CreateCustomReports < ActiveRecord::Migration[5.2]
  def change
    create_table :custom_reports do |t|
      t.string :name
      t.string :table
      t.text :preferences
      t.references :user
      t.references :customer

      t.timestamps
    end
  end
end

t.timestamps ?
這會幫我們在表格分別建立出 created_at 以及 updated_at 兩個時間戳記欄位,會在資料新增及更新的時候把當下的時間寫進去。最後,記得要執行 rails db:migrate 指令,這樣就會把這些描述轉換成真實的資料表。

忘記執行 rails db:migrate 的話會怎麼樣 ?
這時侯在我們的本機端,會出現以下錯誤。
https://ithelp.ithome.com.tw/upload/images/20190915/20112656EiO47z6t9H.png
透過畫面的提示,其實已經說得很清楚了,有 migration 檔案還沒遷移,這時只要執行 rails db:migrate 就可以了,另外,我的習慣是 server 會重開。

修改 Migration:
根據上面的 migration 檔案,假設我們已經執行了,這時候發現有欄位名稱打錯,哪要修改怎麼辦呢 ?

第一種方式,執行 Rollback 指令,把執行過的 Migration 倒回去:
在終端機輸入 rails db:rollback,這樣就會倒回上一個 Migration。如果要一次想要倒轉 3 個 Migration,可以加上 STEP=3 參數:
rails db:rollback STEP=3

如果想知道,哪些 Migration 檔案,有執行過 ?
可以在終端機輸入 rails db:migrate:status
https://ithelp.ithome.com.tw/upload/images/20190915/20112656uZCrzJZitk.png

第二種方式,手動產生 Migration 檔案:
另外再新增一個 Migration 檔案來修正,以下是為 hawb_records 資料表,新增一個叫 security_level_handling 的欄位:
rails g mogration add_security_level_handling_to_hawb_records

class AddSecurityLevelHandlingToHAWBRecords < ActiveRecord::Migration[5.2]
  def change
    add_column :hawb_records, :security_level_handling, :integer, comment: 'SecurityLevelHandling'
  end
end

add_column 這個方法,第一個參數是「資料表名稱」,第二個參數是「要新增的欄位名稱」,第三個參數是這個欄位的「資料型態」。
最後,要執行 rails db:migrate


上一篇
[Day13] Ruby on Rails - Model 基本、Scope 與類別方法
下一篇
[Day15] Ruby on Rails - Model 關聯性,一對一
系列文
Junior Ruby on Rails 工程師的心得與自我挑戰 30 天 (單身狗轉移注意力之歷練)30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言