2016-02-11 75 views
0

我堅持使遷移將更新我的表用戶。我需要設置country_code 1,無論哪裏我有「」或NULL的列。如何使遷移更新表RAILS

感謝

+0

爲什麼它必須是軌道遷移?它可以只是SQL(假設你正在使用SQL DB)查詢來更新表? –

+0

什麼樣的列類型是'country_code',你期望它保存'null',''''和'1'?或者用'1'表示你真的是指'1'嗎? –

回答

2
class UpdateCountryCodeColumnUsers < ActiveRecord::Migration 
    def up 
    execute %Q(
     UPDATE users 
     SET country_code = 1 
     WHERE country_code IS NULL OR country_code = "" 
    ) 
    end 
end 
+0

對於字符串使用雙引號僅適用於某些數據庫,標準SQL對於字符串和標識符(如表和列名稱)使用單引號和雙引號。 –

+0

@ muistooshort,我對此不知道,謝謝 –

2

你可能不應該改變在遷移數據,只用它來改變模式。

許多開發人員使用rake db:reset將不會運行此遷移。

更好的解決方案是創建一個rake或thor任務作爲一個關閉或簡單地執行SQ​​L。

+0

爲什麼不應該在遷移中更改數據?那麼'db:reset'是如何相關的?創建一個獨立的rake或者thor任務來處理你剛剛扔掉的東西,看起來好像它會把你的源代碼樹與那些永遠不會再使用的東西混雜在一起。這對於我來說似乎是一個完美的工作。 –

0
def UpdateCountryCodeForUsers < ActiveRecord::Migration 
    def up 
    Users.where("country_code = '' or country_code = NULL") 
     .update_attributes({country_code: 1}) 
    end 
end 
2

謝爾蓋的回答是你最好的選擇,將更新數據(這將是第一需要 - 而且是非常重要的),它可以讓數據庫做的工作。如果您還需要設置前進的默認值(在Sergei提出更新之後),您可以進行單獨的遷移(以單獨的活動)幷包括以下內容...

您還可以使用rails遷移幫助程序方法change_column_default

change_column_default :users, :country_code, from: nil, to: 1 

如果你想使它可逆只是使用change_column ...

def up 
change_column :users, :country_code, :string, default: 1 
end 

def down 
change_column :users, :country_code, :string, default: nil 
end