2010-11-19 29 views
0

我在找一些提供下列資料:Rails如何在發佈後處理模型/默認值問題?

  1. 你有一個應用程序生活與客戶和真實數據
  2. 在開發新的功能,你需要添加一列來讓說,項目表
  3. 這種新列是某種類型的這是由模型使用before_save

這一切工作正常前進的新項目產生的UID。但是所有現有的項目都沒有這個專欄,一切都打破了。

你如何在Rails世界中處理他?

感謝

回答

2

我認爲這應該在遷移腳本內處理,而不是Rake任務。

如果我理解正確,那麼只需要在列添加到歷史記錄時執行一次。在我看來,遷移腳本不應該使用破損的數據集來保留應用程序。遷移不僅僅是模式更改。

下面是一個例子:

def self.up 
    change_table :projects do |t| 
    t.integer 'new_column' 
    end 

    Project.reset_column_information 

    Project.all.each do |project| 
    project.new_column = some_value 
    project.save 
    end 
end 

的reset_column_information方法讓Rails的知道你剛剛添加的新列的。

+0

我喜歡這個乾淨。在部署中不太記得,似乎更安全。謝謝史蒂夫。 – AnApprentice 2010-11-19 17:48:28

3

你可以簡單地創建一個在所有項目中拉不具有UID和一到每個項目rake任務。

運行遷移後,運行該任務。你所有的項目都應該有一個UID。

+0

同意。如果這是一次性的事情,我通常只是將你在rake任務中的代碼直接放入遷移中,因爲它與遷移密切相關。或者,如果允許此列的nil值,則更改引用此列的應用程序部分並適當處理它(檢查nil)。 – johnmcaliley 2010-11-19 05:25:45

+0

+1表示建議創建一個rake任務。這是我會做的。 :) – Alex 2010-11-19 05:46:44

+0

謝謝大家。我是新的,所以這是有幫助的,雖然似乎沒有任何關於這個主題的教程通過谷歌....在軌道上的目錄嗎?是否存儲rake任務,以便我可以在Heroku上運行它們?此外,任何方式你都可以更新你的答案,顯示rake任務的基本結構或佈局。 – AnApprentice 2010-11-19 06:07:50