我正在将模型中的一些数据拆分成一个新数据并在它们之间创建关联。
我已将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
未填充。
我对此缺少什么?
答案 0 :(得分:2)
这听起来像验证失败了,虽然它也可能是before_* callback阻止了保存。如果没有OldModel代码,我无法进一步推测。
当您预期失败时调用save
并计划检查返回值;如果您希望它成功,请致电save!
,而不是需要例外。我在这里使用save!
因为如果保存失败,我希望迁移失败。
另外:您的迁移将数据从OldModel复制到up
中的NewModel,但不会在down
中以其他方式复制它。在此配置中,rake db:migrate:redo
会成功,但会默默地丢弃信息。如果这些信息对您很重要,我建议a)通过复制数据来进行双向迁移,或者b)删除down
,以便Rails知道它不能解决。