2015-06-17 3 views
0
class UpdateIndexOnUsers < ActiveRecord::Migration 
    def change 
    sql = 'DROP INDEX index_users_on_email' 
    sql << ' ON users' if Rails.env == 'production' # Heroku pg 
    ActiveRecord::Base.connection.execute(sql) 
    end 
end 

Мне нужно отменить эту миграцию. Когда я верну его с помощью rake db:migrate VERSION=20150611173430, я получаю эту ошибку.Реверсирование определенной миграции Rails, невозможно удалить

StandardError: An error has occurred, this and all later migrations canceled: 

PG::SyntaxError: ERROR: syntax error at end of input 
LINE 1: CREATE INDEX index_users_on_email 
             ^
    : CREATE INDEX index_users_on_email/Users/goda/.rvm/gems/ruby-2.2.1/gems/activerecord-4.2.0/lib/active_record/connection_adapters/postgresql/database_statements.rb:155:in `async_exec' 

Затем я добавляю новый файл миграции, чтобы попытаться его отменить.

class FixUpdateIndexOnUsers < ActiveRecord::Migration 
    def change 
    sql = 'CREATE INDEX index_users_on_email' 
    sql << ' ON users' if Rails.env == 'production' # Heroku pg 
    ActiveRecord::Base.connection.execute(sql) 
    end 
end 

BUT on heroku, heroku run rake db:migrate не работает. Потому что он сталкивается с этой синтаксической ошибкой при первой миграции, которую я не могу удалить. То, что должно быть сделано?

EDIT: Исправлен синтаксис, по-прежнему выдающий ошибку.

PG::SyntaxError: ERROR: syntax error at or near "ON" 
LINE 1: DROP INDEX index_users_on_email ON users; 

ответ

0

Вы используете метод изменения, а не вверх, что вы должны делать только для подмножества миграций, что рельсы могут реверс автоматически.

Вы должны изменить метод изменения вверх и добавить метод down, который может изменить эффекты метода up.

+0

Могу ли я просто изменить файл миграции, у меня уже есть db: migrated? – goda

+0

Да, конечно. Это был бы лучший способ - удалить вторую миграцию и исправить методы в первую очередь. –

+0

Спасибо, я думал, что миграция должна быть решена должным образом в одном из генераторов рельсов. Я просто удалил def change, и он работал во время db: rollback и db: migration. – goda