1

레일 이송을 편집하는 데 실수를했습니다 (레일 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 명령을 제거 했으므로 롤백이 성공적이었습니다.

+0

비슷한 상황 (Rails 3.2)이 있으며 '변경'을 '업'으로 교체 한 것이 저에게 효과적이었습니다. – user456584

답변

2

마이그레이션이 최신 레일로 전환되면서 특히 마이그레이션이 역전되었습니다.
나는 http://shardul.wordpress.com/2012/01/25/reversible-migrations/이 필요한 정보와 옵션을 제공 할 것이라고 생각합니다.

btw 3.1과 관련하여 많은 문제가있었습니다. rc 후보자 (예 : rc4, rc5)와 안정적인 새 앱을 위해 3.0.9를 유지해야했습니다.

+0

그 말장난 기사가 나를 위해 해결했습니다! 내 질문을 결과로 업데이트하겠습니다. –