0

次の移行を作成しました。

class FixVoteColumnName < ActiveRecord::Migration
    def change
        rename_column :votes, :post_id, :votable_id
        add_column :votes, :votable_type, :string
      end
    end

そして、この移行を誤って作成し、列の名前を再度変更しました。

class ChangeVoteTableColumns < ActiveRecord::Migration
  def change
    rename_column :votes, :post_id, :votable_id
  end
end

これにより、rake db:migrate: を実行すると明らかにエラーが発生します。

==  FixVoteColumnName: migrating ==============================================
-- rename_column(:votes, :post_id, :votable_id)
rake aborted!
An error has occurred, this and all later migrations canceled:

Missing column votes.post_id

このエラーを最初に見たとき、単純に 2 番目の移行を削除し (たとえば、ゴミ箱フォルダに移動しました)、rake db:migrate を再度実行して、先に進みました。その後、3 つの移行を作成し、正常に実行しました。

Heroku にプッシュしたところ、これに問題があることがわかりました。どういうわけか、Heroku は削除された移行をまだ処理していました。heroku run rake db:schema:reload を実行して動作させましたが、それが長期的な解決策ではないことはわかっています。

私がする必要があるのは、2 番目の移行を db/migrate ディレクトリに戻し、2 番目の移行が適切に実行できるように、:votable_id の名前を :post_id に戻す移行を 2 つの間に挿入することだと思います。rake db:rollback を実行することもできましたが、問題のある移行以降にいくつかの移行が行われたため、面倒になる可能性があります。

これを責任を持って解決する方法についてのアイデアはありますか? これは単なる楽しいプロジェクトなので、データベースを削除しても世界の終わりではありませんが、適切な方法がある場合は、それを行う方法を学びたいと思います。

4

2 に答える 2

4

移行は非常に多くの点で優れていますが、以前の移行と後続の移行が実行されている状態を混同すると、それらの美しさが崩れ、修正するのが本当に頭痛の種になる可能性があります。

これが単なる楽しみである場合は、移行を修正して、すべての移行が正確になり、以前の移行に基づいて構築されるようにします。手順を省略しないでください。次に、移行の最初に戻り、その後に再移行します..

rake db:migrate VERSION=0
rake db:migrate

ライブではないアプリを急いで構築している場合は、バージョン 0 に移行して移行を統合し、リソースを構築する 1 つの移行を作成することがよくあります。必要。

原則として、現在の移行の背後にある移行を削除/変更しないことをお勧めします。あなたが見つけたように、開発中はこれが面倒を引き起こす可能性があり、ライブ中はこれを修正するのが苦痛(そして危険)になる可能性があります。

于 2012-07-29T04:25:49.473 に答える
2

おそらく、削除された移行ファイルが github リポジトリにあります。

このファイルの削除をコミットしたことを確認してください。

git status違いがあれば教えて...

削除されたファイルをコミットするには:

git add -u 
git commit -m "file deleted"

これで、github と heroku にプッシュできます

git push
git push heroku

Heroku には古い移行が表示されないはずです...

于 2012-07-28T18:05:08.247 に答える