資料遷移(Migration)是很多剛接觸 Rails 的一定要學習且最容易出問題的地方,我在接觸這塊時,對 Migration 常見的誤解有:
新增 Migration:
要產生一個 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 的話會怎麼樣 ?
這時侯在我們的本機端,會出現以下錯誤。
透過畫面的提示,其實已經說得很清楚了,有 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
第二種方式,手動產生 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