Rails如何知道迁移已经启动/运行?

时间:2016-04-10 16:32:39

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

我刚加载了一个数据库转储,不仅创建了表,并且在这些表中加载了数据,还进行了大量的迁移。

运行剩余的迁移后,运行rake db:migrate:status告诉我每次迁移的状态为UP,但迁移实际上并没有完成他们应该做的事情。

例如,我有一个迁移创建了一个名为notes的表。它已被提升,表notes不存在。所以我不得不redo进行此迁移,而是在self.down方法中注释掉代码。

我的问题是:即使在数据库中尚未创建它尝试创建的表,迁移如何处于UP状态。或者我想,我之前加载的db哑,填充schema_migrations表的方式是Rails认为大部分迁移都已启动,但实际上并非如此。

现在,我是否需要手动完成每次迁移rake db:migrate:redo VERSION=xxxxxxx,还是有更好的解决方案?

2 个答案:

答案 0 :(得分:5)

Rails为名为schema_migrations的模式添加了一个表,该表将每个迁移的时间戳存储在一个列中。它不会显示在schema.rb中,但Rails会将db/migrate中的时间戳和schema.rb的时间戳与schema_migrations表的值进行比较,以确定哪些迁移已经开始。

enter image description here

答案 1 :(得分:1)

Rails使用Rack中间件ActiveRecord::Migration::CheckPending来做到这一点。

您可以通过在控制台中执行rack middleware来查看Rails正在使用的所有Rack中间件。