Rails 4如何忽略挂起的迁移

时间:2013-11-27 13:50:02

标签: ruby-on-rails ruby activerecord

问题如下:

  • 我有db / seed.rb充满了初始数据。
  • 其中一次迁移取决于此种子提供的数据。
  • 我正在尝试从空数据库部署我的应用程序。

结果是:

  • RAILS_ENV =生产rake db:migrate - 由于缺少初始数据而失败
  • RAILS_ENV =生产rake db:seed - 由于待定迁移而失败

我想以某种方式告诉rake忽略挂起的迁移,但到目前为止无法做到。

更新(由于其他经验)

有时,迁移和模型代码不同步,因此无法运行迁移。 为避免此问题,最近在迁移中重新定义了模型:

# reset all callbacks, hooks, etc for this model
class MyAwesomeModel < ActiveRecord::Base
end

class DoSomethingCool < ActiveRecord::Migration
  def change
    ...
  end
end

6 个答案:

答案 0 :(得分:127)

我不确定这是否会对你有所帮助。但我正在找东西,发现了这个问题。所以看起来这可能会有所帮助:

在RAILS_ROOT / config / environments / development.rb中 将以下设置设为false:

 config.active_record.migration_error = false#:page_load

在我的情况下,它现在不再显示挂起的迁移错误。对于相同的环境也应该适用于rake任务和控制台。

答案 1 :(得分:26)

根据以下数据重命名迁移:

20140730091353_migration_name.rb

.20140730091353_migration_name.rb

(在文件名的开头添加一个点)

然后运行rake db:seed(它将不再抱怨待处理的迁移),然后重命名迁移。

如果您之后有更多迁移,则必须重命名所有迁移,或者暂时将其移除。

答案 2 :(得分:10)

Rails将迁移信息存储在名为schema_migrations的表中。

您可以将迁移中的版本添加到该表中,以跳过特定的迁移。

版本是文件名中描述之前的数字字符串。

[version]_Create_Awesome.rb

答案 3 :(得分:2)

除非你修改Rails代码,否则没有办法。我强烈建议您修改迁移。

迁移不应该依赖于数据库中某些数据的存在。它可能取决于先前的迁移,但当然绝对不依赖于db上的数据。

答案 4 :(得分:2)

我有类似的问题。我注释掉了add_column行并运行了rake db:migrate命令,然后在我需要测试或生产环境时删除了注释。

答案 5 :(得分:0)

如果在尝试从正在运行的 Rails应用程序中播种数据时遇到“待处理的迁移”问题,则可以直接调用此方法,从而避免进行abort_if_pending_migrations检查:< / p>

ActiveRecord::Tasks::DatabaseTasks.load_seed

查看从ActiveRecord内部实际调用种子的位置:

https://github.com/rails/rails/blob/v6.0.3.2/activerecord/lib/active_record/railties/databases.rake#L331

并查看DatabaseTasks文档:

https://apidock.com/rails/v6.0.0/ActiveRecord/Tasks/DatabaseTasks https://apidock.com/rails/v6.0.0/ActiveRecord/Tasks/DatabaseTasks/load_seed