레일 이송을 편집하는 데 실수를했습니다 (레일 3.1.0rc5를 사용하고 있습니다). 그래서 나는 그것을 바로 잡고 rake db:rollback
다음에 rake db:migrate db:test:prepare
을 시도했다. 그러나 롤백은 어떤 이유로 실패했습니다.레일 마이그레이션에 롤백하지 못했습니다.
== 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를 사용하고 있습니다) :이 db:rollback
의 응답이
def down
drop_table :assets
end
다음은 마이그레이션의 롤백 부분이다 의 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
을 사용하여 어디에서 레일이 드롭 명령을 받고 있는지 알 수 있었지만 아무것도 찾을 수 없었습니다.
그럼이 마이그레이션을 어떻게 다시 실행해야합니까? 레일이 드롭 명령을받는 곳이 궁금합니다.
UPDATE : 그것은 그 롤백 할 때 down
방법 '마이그레이션 클래스에 보이지 않는 실제로 3.1 레일 밝혀! change
메서드의 마이그레이션 명령을 살펴보고 역순으로 처리합니다. 그래서 drop_table :assets
명령어를 제거한 후에도 rake db:rollback
이 (가) 자산 테이블을 삭제하려고 시도한 것입니다! 이 문제를 해결하려면 change
메서드를 이전 레일 3.0 스타일 up
메서드로 변경해야합니다. 그런 다음 레일은 down
메서드를 보았습니다.이 메서드는 drop_table
명령을 제거 했으므로 롤백이 성공적이었습니다.
비슷한 상황 (Rails 3.2)이 있으며 '변경'을 '업'으로 교체 한 것이 저에게 효과적이었습니다. – user456584