0

モデルの一部のデータを新しいモデルに分割し、それらの間の関連付けを作成しています。

文字列属性として作成されたnew_model_idtoを追加し、次の移行を行いました。OldModelNewModeladdress

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 に答える