這聽起來像你的狀態下生產的DB模式沒有按是與你在開發中使用的內容完全一致(儘管它不完全清楚)。我會在沙子上畫一條線,讓這個prod db處於更好的狀態。基本上你想要做的是確保prod數據庫有一個「schema_info」表,它列出了你不想在生產中運行的任何遷移。然後,您可以將遷移添加到您的內容中,並且它們將針對生產分貝進行處理。
一旦你完成了,你可以編寫添加模式更改或添加數據的遷移,但有一點你需要非常小心的是,如果你使用遷移添加數據,你必須在遷移中定義模型本身,就像這樣:
class AddSomeColumnsToUserTable < ActiveRecord::Migration
class User < ActiveRecord::Base; end
def self.up
add_column :users, :super_cool, :boolean, :default => :false
u = User.find_by_login('cameron')
u.super_cool = true
u.save
end
def self.down
remove_column :users, :super_cool
end
end
這樣做的原因是,在未來,你可能完全消除模型,一些重構或其他期間。如果您沒有在「User.find_by_login ...」行上定義用戶類,遷移將引發異常,這是一個很大的麻煩。
數據庫已經在使用,所以我不想丟失現有的數據,並且寧願不必花時間重建和重新填充,如果我可以避免它。 – srboisvert 2008-10-15 18:22:41
那麼,遷移是破壞性的?或者您目前正在使用遷移,但以前從未在生產中使用它們,因此它會嘗試執行所有遷移,其中一些遷移較舊且不再相關,因此可能會導致問題? – Matt 2008-10-15 18:25:19