2012-08-22 136 views
1

爲客戶端工作在3.0 rails項目上,並且我需要運行一個實時生產服務器的敏感遷移。它基本上是假設在數據庫,FL - > fl,PA - > pa等所有州縮寫... 由於限制我不能在本地測試: 確實調用遷移效果的措辭什麼?我知道它與添加和創建等,但不知道更新這樣的信息時。移植評論

rails g migration UpdateStateAbbreviation 

def self.up  
    say_with_time "Updating states abbreviation..." do 
    State.find(:all).each do |s| 
    tmp = s.abbreviation.downcase 
    s.update_attribute :abbreviation, tmp 
    end 
end end 

Rake db:migrate 

回答

2

遷移的一個非常重要的規則是永遠不要在您的遷移中引用模型。這可能看起來像是一個學術問題,但在將來的某個時候,根本沒有State模型,並且在刪除app/models/state.rb時,此遷移將不起作用。

無論將來發生什麼變化,正確構建的遷移都將正確執行。無論它做什麼都可能後來沒有完成,這沒有什麼不妥,但是設置失敗並不是一個好主意。

execute "UPDATE states SET abbreviation=LOWER(abbreviation)" 

使用模型遷移導致各種問題:

您可以在數據庫中使用字符串函數類的東西做這個downcasing操作。這也適用於使用您的模型預先填充某些關鍵記錄。如果您必須(或甚至更好)使用seeds.rb任務來爲您完成此任務,請使用seeds.rb

需要注意的是,如果您無法在本地進行測試,那麼您的開發流程非常瑕疵。您應始終在適用的情況下運行並測試您的遷移,以確保其正常工作。如果您出於安全或隱私的原因無法獲得實際的生產數據,請與您的DBA合作,爲測試目的獲取經過清理的非敏感版本。例如,州名不應該是機密的。