2016-02-11 127 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