1

Railsの移行の編集を間違えました(Rails 3.1.0rc5を使用しています)。rake db:rollbackだから私はそれを修正し、続いて。を実行しようとしましたrake db:migrate db:test:prepare。しかし、何らかの理由でロールバックが失敗しました。移行のロールバック部分は次のとおりです。

  def down
    drop_table :assets
  end

これはからの応答ですdb:rollback

==  CreateAssets: reverting ===================================================
rake aborted!
An error has occurred, this and all later migrations canceled:

ActiveRecord::IrreversibleMigration

Tasks: TOP => db:rollback
(See full trace by running task with --trace)

そのため、データベース内のアセットテーブルを手動で削除し(sqlite3 dbsを使用しているだけです)、行をコメントアウトして再度drop_table :assets実行しました。db:rollback

==  CreateAssets: reverting ===================================================
-- drop_table("assets")
rake aborted!
An error has occurred, this and all later migrations canceled:

SQLite3::SQLException: no such table: assets: DROP TABLE "assets"

Tasks: TOP => db:rollback
(See full trace by running task with --trace)

なぜアセットテーブルを削除しようとしているのですか?drop_table :assets移行からその行をコメントアウトしました(実際には後で削除しました) 。grep -r assetsRailsがそのドロップコマンドをどこから取得しているのかを確認することもしましたが、何も見つかりませんでした。

だから私の質問は、この移行を再実行するにはどうすればよいですか?そして、私はrailsがそのドロップコマンドをどこで取得しているのか知りたいですか?

更新down:rails 3.1は、ロールバック時に実際には移行クラスのメソッドを参照しないことが判明しましたメソッドの移行コマンドを調べて、changeそれらを逆にします。そのため命令rake db:rollbackを削除した後でもアセットテーブルを削除しようとしていましたdrop_table :assetsこれを修正したchangeメソッドを古いrails3.0スタイルupメソッドに変更したことです。次に、railsはコマンドをdown削除したメソッドをdrop_table

4

1 に答える 1

2

移行は、最新のレールでかなり変更されました。特に、移行を逆にしました。http://shardul.wordpress.com/2012/01/25/reversible-migrations/が必要な情報とオプションを提供すると
思います。

ところで、私は3.1で多くの問題を抱えていました。rc候補(例:rc4、rc5)であり、現在安定した新しいアプリを入手するには3.0.9のままにする必要があります。

于 2011-08-21T12:24:35.697 に答える