Я сделал ошибку при редактировании миграции 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 assets
, чтобы увидеть, откуда рельсы могут получать эту команду сброса, но ничего не смог найти.
Итак, мой вопрос: как мне выполнить повторную миграцию?И мне любопытно, откуда rails получает эту команду сброса?
UPDATE : Оказывается, что rails 3.1 на самом деле не смотрит на класс миграции 'down
метод при откате!Он просматривает команды миграции метода change
и обращает их вспять.Вот почему rake db:rollback
пытался удалить таблицу ресурсов даже после того, как я удалил инструкцию drop_table :assets
!Как я это исправил, я изменил метод change
на старый метод rails 3.0 style up
.Затем рельсы посмотрели на метод down
, из которого я удалил команду drop_table
, и откат прошел успешно.