Существует несколько причин, по которым ваши миграции не будут выполняться, но наиболее распространенным является то, что в системе уже создается впечатление, что все определенные вами миграции уже запущены.
Каждая миграция создает запись в таблице schema_migrations
со столбцом version
, соответствующим номеру идентификатора. Если вы хотите перезапустить миграцию, вы обычно можете отменить ее и повторить попытку. Например, если бы у вас было 20100421175455_create_things.rb
, вы бы запустили его заново, используя:
rake db:migrate:redo VERSION=20100421175455
Распространенной ситуацией является то, что ваша миграция не была запущена в первую очередь, что она сгенерировала, например, исключение, и все же Rails по-прежнему считает его завершенным. Для принудительного повторного запуска миграции удалите соответствующую запись из таблицы schema_migrations
и снова запустите rake db:migrate
.
Один из способов избежать подобных проблем в будущем - определить миграции с помощью автоматической процедуры возврата:
class CreateThings < ActiveRecord::Migration
def self.up
# ... (migration) ...
rescue
# If an exception occurs, back out of this migration, but ignore any
# exceptions generated there. Do the best you can.
self.down rescue nil
# Re-raise this exception for diagnostic purposes.
raise
end
end
Если у вас возникла ошибка при переносе, вы увидите исключение, указанное на консоли. Поскольку миграция автоматически откатывается, вы сможете запускать ее снова и снова, пока не сделаете все правильно.