Rails:在生产环境中更改数据库模型

时间:2014-03-20 15:11:25

标签: ruby-on-rails has-and-belongs-to-many

我需要转换一些数据,但不知道该怎么做。

我有一个专业型号,有外键。我们认为这还不够,并将“有很多”改为HABTM模型,但现在在生产环境中,我需要将数据从foo_id字段转换为professional_foo联合表。

“添加表”迁移将在“删除列”之前执行,但我应该如何设置转换,因为我知道我使用的旧数据库正在使用的数据库中,我将对系统进行新的设置将直接进入最后一个代码版本,因为那样,不需要进行任何转换。 (在最新版本上初始化脚本已经修复。

1 个答案:

答案 0 :(得分:0)

我建议在add table和drop column之间的迁移中进行数据转换。在部署新代码时应该运行此迁移,以便新代码能够与新数据结构一起使用,并且没有任何数据的新安装只会快速运行迁移,因为它不会成功要转换的数据。

迁移看起来像:

class OldProfessional < ActiveRecord::Base
  self.table_name = "professionals"
  has_many :foos
end
class NewProfessional < ActiveRecord::Base
  self.table_name = "professionals"
  has_and_belongs_to_many :foos
end

class MigrateFoosToHasAndBelongsToMany < ActiveRecord::Migration
  def up
    OldProfessional.all.each do |old_pro|
      new_pro = NewProfessinoal.find(old_pro.id)
      old_pro.foos.each do |foo|
        new_pro.foos << foo
      end
      new_pro.save!
    end
  end
  def down
    NewProfessional.all.each do |new_pro|
      old_pro = OldProfessional.find(new_pro.id)
      new_pro.foos.each do |foo|
         old_pro.foos << foo
      end
      old_pro.save!
    end
  end
end