Rails - 在迁移期间转换数据

时间:2012-09-22 03:30:17

标签: ruby-on-rails rails-migrations

我正在将模型中的一些数据拆分成一个新数据并在它们之间创建关联。

我已将new_model_id添加到OldModel,使用NewModel创建address作为字符串属性,并进行以下迁移:

class RemoveAddressFromOldModel < ActiveRecord::Migration
  def up
    OldModel.where("address IS NOT NULL AND address != ''").each do |i|
      j = NewModel.create(address: i.address)
      i.new_model_id = j.id
      i.save
    end
    remove_column :old_models, :address
  end

  def down
    add_column :old_models, :address, :string
  end
end

虽然NewModel.create工作正常并获得了正确的数据,但i.save似乎无法正常工作,因为old_models.new_model_id未填充。

我对此缺少什么?

1 个答案:

答案 0 :(得分:2)

这听起来像验证失败了,虽然它也可能是before_* callback阻止了保存。如果没有OldModel代码,我无法进一步推测。

当您预期失败时调用save并计划检查返回值;如果您希望它成功,请致电save!,而不是需要例外。我在这里使用save!因为如果保存失败,我希望迁移失败。

另外:您的迁移将数据从OldModel复制到up中的NewModel,但不会在down中以其他方式复制它。在此配置中,rake db:migrate:redo会成功,但会默默地丢弃信息。如果这些信息对您很重要,我建议a)通过复制数据来进行双向迁移,或者b)删除down,以便Rails知道它不能解决。