替换迁移中列的值

时间:2013-04-23 10:40:12

标签: ruby-on-rails-3 migration

我有一个名为“p_type”的列,它是字符串,因为我认为类型为ABC为字符串

现在我意识到最好将其设为bitmask,这样我就可以将AC放在一起。

如果我这样做

change_column :cars, :p_type, :integer

我要么丢失所有现有的p_type数据,要么会出现严重错误,迁移会以某种方式扭曲数据(我不敢尝试)

有没有办法将列类型更改为:integer并在迁移文件中具有某种功能

if A
 p_type = 1
elsif B
 p_type = 2
elsif C
 p_type = 4
end

所以迁移会改变数据类型和数据本身吗?

2 个答案:

答案 0 :(得分:0)

您可以先运行一个rake任务来更新p_type列,

Model_name.each { |obj|
if obj.p_type == "A"
 p_type = "1"
elsif obj.p_type == "B"
 p_type = "2"
elsif obj.p_type == "C"
 p_type = "4"
end
obj.save
}

希望这会有所帮助。

答案 1 :(得分:0)

How do I change column type in Heroku?

解决了这个问题
rename_column :cars, :p_type , :p_type_string
add_column :cars, :p_type , :integer
Car.reset_column_information
Car.find_each { |c| c.update_attribute(:p_type , c.p_type_string) } 
remove_column :cars, :p_type_string