次の移行を作成しました。
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 を実行することもできましたが、問題のある移行以降にいくつかの移行が行われたため、面倒になる可能性があります。
これを責任を持って解決する方法についてのアイデアはありますか? これは単なる楽しいプロジェクトなので、データベースを削除しても世界の終わりではありませんが、適切な方法がある場合は、それを行う方法を学びたいと思います。