【问题标题】:Replacing values of a column in a migration在迁移中替换列的值
【发布时间】:2013-04-16 13:03:28
【问题描述】:

我有一个名为“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

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

【问题讨论】:

    标签: ruby-on-rails-3 migration


    【解决方案1】:

    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
    

    【讨论】:

      【解决方案2】:

      您可以先运行一个 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
      }
      

      希望这会有所帮助。

      【讨论】:

      • 您必须从 rails 控制台(rails c -e production)或从迁移中执行此操作。我不确定为数据迁移创建一个新的 rake 任务是一个不错的选择。
      猜你喜欢
      • 2020-12-28
      • 1970-01-01
      • 1970-01-01
      • 2020-12-04
      • 2013-11-13
      • 2016-06-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多