错误迁移正在等待; 运行’rake db:migrate RAILS_ENV = development’来解决此问题

我试图回滚上次迁移:

rake db:rollback 

它告诉我以下内容:

 == AddUserIdToPictures: reverting ============================================ -- remove_index(:pictures, {:column=>[:user_id, :visible]}) -> 0.1201s -- remove_column(:pictures, :user_id, :integer) -> 0.0127s == AddUserIdToPictures: reverted (0.1567s) =================================== 

然后,如果我尝试访问某些页面,我会收到错误:

 Migrations are pending; run 'rake db:migrate RAILS_ENV=development' to resolve this issue 

但当我做什么错误说:rake db:migrate RAILS_ENV = development,它重新创建我上面的回滚:

 == AddUserIdToPictures: migrating ============================================ -- add_column(:pictures, :user_id, :integer) -> 0.0300s -- add_index(:pictures, [:user_id, :visible]) -> 0.1007s == AddUserIdToPictures: migrated (0.1310s) =================================== 

这有什么不对? 我应该在运行命令之前删除迁移文件吗?

如果回滚迁移,则数据库架构将还原为先前的迁移。

但是,如果将迁移保留在迁移文件夹中,则Rails会假定应该运行迁移,并且在迁移到最新的模式之前将无法运行。

如果要回滚模式,则应放弃迁移。 删除文件,Rails不会抱怨。

请记住,Rails创建了一个schema_migrations表,该表由一个名为“version”的列组成,其中包含最新的模式迁移ID字符串。 id字符串对应于db / schema.rb中的id字符串:

 ActiveRecord::Schema.define(version: 20140284052547) do # Your model definitions end 

如果SchemaMigration#version中的版本字符串与db / schema.rb中的版本字符串不匹配,则会出现“正在等待迁移”exception。 如果您设置新系统或执行干净的OS安装,然后从备份文件还原数据库,以及运行’rake db:migrate’,则有时会发生这种情况 – 版本字符串将不同步。 解决问题的方法是简单地在schema_migrations表中插入一个新行,其值包含在db / schema.rb中 – 但只有在您确定实际数据库与schema.rb中的模式定义匹配时才执行此操作:

 insert into schema_migrations (version) values ('20140284052547'); 

尝试通过以下方式回滚最后两次迁移:rake db:rollback STEP = 2

尝试使用此命令进行回滚,而不是

 rake db:rollback 

如果要更改迁移文件,请使用:

 rake db:migrate:redo STEP=1 

如果你想删除表,请使用它

 rake db:migrate:down VERSION=your_migration_version