Rails Migrations 砍掉重練

今天看 AWDwR 2nd. 第16章 Migrations 的時候,有一節叫 When Migrations Go Bad,意思是說若跑 Migrations 的時候意外死掉,例如以下這種情況,table one好了,table two還沒…

def self.up do…
  create_table :one do …
  end
  create_table :two do..
  end
end

def self.down
  drop_table :two
  drop_table :one
end

此時要怎麼處理呢? up跟down進退不得呢,書上的解法很簡單,就是砍掉重練,把全部 table drop掉,重新跑一遍 rake db:migrate。

讓我印象深刻的是這招最後一節又提到一次。問題是說隨著 migrations 的累進,每個 schema 定義可能會散佈在各個 migration 檔案中,我們要如何一眼看懂每張 table 最後到底有哪些欄位?

方法一是看 db/schema.rb 檔,有全部的定義(Ruby form)

方法二是保持每張 table 只有唯一的 migration 檔案,有任何修改不要新增再 migration檔案了,而是用編輯的方式,每次有修改就砍掉重練即可。話說此招雖然跟 Migrations 版本累進的概念不同,但也是可以work。

方法三是裝 annotate_models plugin,每次有變動你只要跑 rake annotate_models,他就會在你的 model 自動加上 table column 註解,一目瞭然。用法跟結果可以參考這篇

題外話,今天系上有某老師進不去openwebmail,登入後吐 Internal error,我跟電腦助理最後的解法也是砍掉重練… :p (有種很遜的感覺)

One thought on “Rails Migrations 砍掉重練

Leave a Reply