ROR: Ошибка при выполнении db:migrate

При запуске последней миграции в RoR под Windows может возникать следующая ошибка:

  1. C:\test>rake db:migrate
  2. (]]>in]]> C:/test)
  3. rake aborted!
  4. No migration with version
  5. number 2
  6. (See full trace by running task with --trace)

Номер версии в сообщении об ошибке может отличаться от 2. Эта ошибка может появляться даже при запуске миграции в свежесозданном проекте, в котором ни какой версии миграции выше 0 быть не может. Вся проблема оказывается в том что в переменную среды VERSION, если она не указана явно при выполнении rake db:migrate записывается какое-то значение. Посмотреть это можно, добавив в файл environment.rb строку puts ENV['VERSION'] и запустив миграции без указания версии.

Исправляется это недоразумение просто - для миграции до последней версии надо вместо номера версии указать latest. То есть запускать миграцию следующей командой:

  1. C:\test>rake db:migrate VERSION=latest

Либо немного грубоватый вариант - подправить файл rake (он лежит в папке bin установки Ruby), добавив первой строкой программы:

  1. ENV['VERSION'] = nil

для Rails версии 2.3.5 rake файл будет выглядеть так:

  1. #!C:/WebServer/Ruby/bin/ruby.exe
  2. #
  3. # This file was generated by RubyGems.
  4. #
  5. # The application 'rake' is installed as part of a gem, and
  6. # this file is here to facilitate running it.
  7. #
  8.  
  9. ENV['VERSION'] = nil
  10.  
  11. require 'rubygems'
  12.  
  13. version = ">= 0"
  14.  
  15. if ARGV.first =~ /^_(.*)_$/ and Gem::Version.correct? $1 then
  16. version = $1
  17. ARGV.shift
  18. end
  19.  
  20.  
  21. gem 'rake', version
  22. load Gem.bin_path('rake', 'rake', version)

Сам воспользовался вторым вариантом - он более простой в использовании, но требует внимания при обновлении версий gems.