即使没有挂起的迁移,Rails 4也会抛出挂起的迁移错误

时间:2014-03-24 17:08:57

标签: ruby-on-rails-4 rails-migrations

我最近将我的应用程序从Rails 3.2.15升级到Rails 4.0.4并且rake测试失败了抛出:

You have 161 pending migrations:
  20111126090934 DeviseCreateUsers
  20111126195631 AddUsernameToUsers
  20111128012039 CreateLocations
  20111129051416 AddConfirmableToDevise
...
Run `rake db:migrate` to update your database then try again.

我确信,我没有任何待处理的迁移,而且schema_migrations表是所有迁移版本号的最新版本。此外,

[2] pry(main)> ActiveRecord::Migration.check_pending!
  ActiveRecord::SchemaMigration Load (0.4ms)  SELECT `schema_migrations`.* FROM `schema_migrations`
=> nil
[3] pry(main)> 

由于这是开发环境,我还尝试reset db

$> rake db:migrate:reset

我正在将我的应用程序从Rails 3.2.15移动到Rails 4.0.4。我在这里不知所措,不了解正在发生的事情。

$> rake db:migrate:status

Status   Migration ID    Migration Name
--------------------------------------------------
   up     20111126090934  ********** NO FILE **********
   up     20111126195631  ********** NO FILE **********
   up     20111128012039  ********** NO FILE **********
   up     20111129051416  ********** NO FILE **********
...

4 个答案:

答案 0 :(得分:3)

这有点奇怪和令人沮丧。我在db / migrate目录中有子文件夹,即使较旧且已经迁移,由于某种原因,它们也会通过ActiveRecord::Migrator#pending_migrations列出并因此出错。删除子文件夹修复此问题。

想知道这在Rails 3中是如何工作的,并且找不到任何关于此的文档。

答案 1 :(得分:2)

此错误的最可能原因是mysqldump不在您的PATH中。 Rails 4需要创建测试数据库,如果没有找到,则会出现有关迁移的混乱错误。

在OSX上MySQL的默认安装不包括你的PATH中的mysql或mysqldump,你需要修改你的〜/ .profile并添加如下内容:

export PATH=$PATH:/usr/local/mysql/bin

或者从homebrew重新安装mysql。

答案 2 :(得分:0)

添加到Syed的答案:

您可以重命名它们,而不是删除.cookies中的子文件夹,而不是将其重命名为'。'。这对我使用activerecord 3.2。

Ex:将db/migrate/重命名为db/migrate/archive/

答案 3 :(得分:-1)

当您尝试运行rake test时,您需要在test环境中运行迁移。

rake db:migrate RAILS_ENV=test