2016-11-16 83 views
0

我正在不同的分支上工作,並且在這些分支上有遷移文件。有一個schema.rb文件。無論分支是否運行遷移

我的問題是,無論我目前在哪個分支,運行遷移都會以某種方式更改schema.rb,就好像它考慮了所有分支上的所有遷移一樣。

說,我創建了Foo模型分支A與相應的表foos,運行遷移並切換到另一個分支。

我當前分支B,那裏沒有foos表運行一些其他遷移(說創建表bars),創建它:

# while on branch B 
Foo 
#=> NameError: uninitialized constant Foo 
ActiveRecord::Base.connection.table_exists?('foos') 
#=> true 

問:我如何schema.rb只根據改變在當前分支上遷移?

回答

2

db:migratedb:rollback作業寫入schema.rb來自用戶數據庫模式的文件,而不是來自用戶遷移腳本。即使你改變了git分支,你的數據庫狀態也不會改變。所以foos表存在,但Foo模型不存在。

我的回答:結帳分支之前就回滾,或寫git的鉤子腳本回滾每次你檢出分支

+0

我想回滾這裏是一個有效的選擇,但我想建立一些更穩健,讓我不必每次我切換分支的時間來回滾。你能想到什麼嗎? –

+0

@AndreyDeineko如何編寫git鉤子腳本來比較主分支和當前分支之間的遷移版本和回滾。它在結帳時執行新分支 –

0

你可能有忽視了混帳您schema.rb。一種解決方案是不要忽略這個文件。在項目的根文件夾中查看.gitignore,然後將schema.rb移出。

如果它不是在.gitignore您的問題無關,同schema.rb做,因爲它應該是每個分支不同。這個問題可能是,你只能有一個本地數據庫文件和你在同一個數據庫上運行不同分支機構的遷移,這就是爲什麼你會得到:

ActiveRecord::Base.connection.table_exists?('foos') 
#=> true 

你應該有數據庫的不同副本,每個分支和在更改正在處理的分支時更改它,或者使用config/databases.yml上的不同配置,環境變量或手動更改數據庫文件名。

+0

它不在'.gitignore'中 –

1

使用每個分支數據庫和連接設置。