0

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

我添加了new_model_idto OldModelNewModel使用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没有被填充。

我错过了什么?

4

1 回答 1

2

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

save当您预计它会失败并计划检查返回值时调用;当您期望它成功时调用save!它需要一个异常。我会save!在这里使用,因为如果保存失败,我希望迁移失败。

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

于 2012-09-22T04:54:13.683 回答