我正在将模型中的一些数据拆分到一个新的模型中,并在它们之间创建一个关联。
我已经将new_model_id添加到OldModel,使用address作为字符串属性创建了NewModel,并进行了以下迁移:
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没有被填充。
我错过了什么?
发布于 2012-09-22 12:54:14
对我来说,这听起来像是验证失败了,尽管它也可能是阻止保存的before_* callback。没有OldModel代码,我无法进一步推测。
当您期望它失败并且您计划检查返回值时,调用save;当您期望它成功时,调用save!,希望得到一个异常。我在这里使用save!,因为如果保存失败,我希望迁移失败。
另外:您的迁移在up中将数据从OldModel复制到NewModel,但在down中不会以相反的方式复制数据。在此配置中,rake db:migrate:redo将成功,但会以静默方式丢弃信息。如果这些信息对您很重要,我建议您a)通过将数据复制回来进行双向迁移,或者b)删除down,以便Rails知道它无法撤消。
https://stackoverflow.com/questions/12540441
复制相似问题