2013-12-10 50 views
1

我有多個分支,每個分支都有一個遷移文件。所以當我籤​​出一個分支時,我會執行db:migrate,然後它會更新我的schema.rb文件。schema.rb在rake db上沒有得到更新:回滾

但是,當我簽出另一個分支並運行rake db:migrate時,理想情況下,我在前一分支中的遷移應該從schema.rb中刪除,並且新遷移的詳細信息應該納入schema.rb

這沒有發生。

所以,我做了一個rake db:rollback STEP = 5,當我檢出一個新的分支,然後做了一個db:migrate。即使是現在,我也有關於前一分支遷移的表格細節。我做錯了什麼?或者這是Rails的行爲?

回答

1

所有執行的遷移都保存在表schema_migrations(遷移時間戳保存在數據庫中)。當您運行rake db:migrate Rails解析目錄db/migrate並查找表中未顯示的文件(它通過時間戳進行比較)。

讓我們你有你在分支大師10遷移 - schema_migrations有10個記錄與時間戳。您從主branch_1創建一個新分支,創建並運行一個新的遷移。您的表格schema_migrations有11條記錄。

您回到主頁並運行rake db:migrate - Rails不會執行任何操作,因爲找不到任何新文件(位於db/migrate)。當你運行rake db:rollback STEP=5我想(我從來沒有檢查過)Rails從分支MASTER回滾5個最後的遷移。這是合乎邏輯的,因爲最後的遷移(在branch_1中創建)在分支主機中不存在(代碼文件僅存在於分支1中!)。因此,您無法從分支主機中回滾branch_1中進行的數據庫更改。

什麼todo ?!我看到幾種策略:

1)簽出到branch_1並運行rake db:rollback STEP=N(N> =新遷移的計數)(您可以回滾更多的遷移,然後您在此分支中執行)。退回到master並運行rake db:migrate(執行從主設備遷移)

2)當你有生產轉儲或良好的種子。 掛斷當前數據庫,負載突降(或種子),運行rake db:migrate (對於我來說,這是當你有生產轉儲最簡單的辦法!)

PS也許SMBD其他建議等方式來獲得正確的DB在當前分支