Rails 如何知道迁移已经启动'ed/run?
How does Rails know that a migration has been up'ed/run?
我刚刚加载了一个数据库转储,它不仅创建了 tables,并在那些 tables 中加载了数据,它还进行了很多迁移。
在 运行 剩余的迁移之后,运行 rake db:migrate:status
告诉我每个迁移的状态是 UP
,但是迁移实际上并没有完成它们的工作应该做的。
例如,我有一个创建名为 notes
的 table 的迁移。它已被更新,tables notes
不存在。所以我不得不 redo
这个迁移,但是注释掉 self.down
方法中的代码。
我的问题是:迁移如何处于 UP
状态,即使它尝试创建的 table 尚未在数据库中创建。或者我猜想,我之前加载的 db dumb 已经填充了 schema_migrations
table,Rails 认为大部分迁移都已启动,但实际上并没有。
现在,我需要手动rake db:migrate:redo VERSION=xxxxxxx
每次迁移,还是有更好的解决方案?
Rails 使用 Rack 中间件 ActiveRecord::Migration::CheckPending
来做到这一点。
您可以通过在控制台中执行 rack middleware
来查看 Rails 正在使用的所有 Rack 中间件。
Rails 将 table 添加到名为 schema_migrations
的架构中,它将每个迁移的时间戳存储在一个列中。它不会出现在 schema.rb
中,但 Rails 会将 db/migrate
中的时间戳和 schema.rb
中的时间戳与 schema_migrations
的值进行比较 table 以确定哪些迁移具有 运行.
我刚刚加载了一个数据库转储,它不仅创建了 tables,并在那些 tables 中加载了数据,它还进行了很多迁移。
在 运行 剩余的迁移之后,运行 rake db:migrate:status
告诉我每个迁移的状态是 UP
,但是迁移实际上并没有完成它们的工作应该做的。
例如,我有一个创建名为 notes
的 table 的迁移。它已被更新,tables notes
不存在。所以我不得不 redo
这个迁移,但是注释掉 self.down
方法中的代码。
我的问题是:迁移如何处于 UP
状态,即使它尝试创建的 table 尚未在数据库中创建。或者我猜想,我之前加载的 db dumb 已经填充了 schema_migrations
table,Rails 认为大部分迁移都已启动,但实际上并没有。
现在,我需要手动rake db:migrate:redo VERSION=xxxxxxx
每次迁移,还是有更好的解决方案?
Rails 使用 Rack 中间件 ActiveRecord::Migration::CheckPending
来做到这一点。
您可以通过在控制台中执行 rack middleware
来查看 Rails 正在使用的所有 Rack 中间件。
Rails 将 table 添加到名为 schema_migrations
的架构中,它将每个迁移的时间戳存储在一个列中。它不会出现在 schema.rb
中,但 Rails 会将 db/migrate
中的时间戳和 schema.rb
中的时间戳与 schema_migrations
的值进行比较 table 以确定哪些迁移具有 运行.