今天看 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
enddef 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 (有種很遜的感覺)
把資料庫schema_info原本的值-1,在rake db:migrate應該也可以喔~