【问题标题】:How does Rails know that migrations are pending?Rails 如何知道迁移正在等待中?
【发布时间】:2016-12-08 12:05:45
【问题描述】:

在 Rails 中,有时会出现错误

ActiveRecord::PendingMigrationError

Rails 如何知道迁移是挂起的?

该标志/信息存储在哪里?

【问题讨论】:

标签: ruby-on-rails activerecord database-migration


【解决方案1】:

创建模型或迁移时,会在文件名中添加时间戳。

         20160727050119_create_user.rb
         #time-stamp 20160727050119

然后是一个方法call(env) 检索最后一个迁移戳。

       `mtime = ActiveRecord::Migrator.last_migration.mtime.to_i`

并将其与@last_check 进行比较,如果小于mtime

check_pending! 被调用并显示ActiveRecord::PendingMigrationError

       ActiveRecord::Migration.check_pending!(connection) 

check_pending!

      def check_pending!(connection = Base.connection)
        raise ActiveRecord::PendingMigrationError if ActiveRecord::Migrator.needs_migration?(connection)
      end

你可以找到所有这些信息.../lib/active-record/migration.rb

【讨论】:

  • 有用的信息,并解释了我遇到的一个问题:如果您正在提交您的 schema.rb 文件并且未能将版本参数提交到文件顶部的 ActiveRecord::Schema.define 以及您的其他文件更改时,可能会导致其他人(在我的情况下是 CI 系统)在尝试运行测试时收到挂起的迁移错误,因为架构版本小于最近迁移的时间戳。
【解决方案2】:

在您的应用程序的数据库中有一个名为 schema_migrations 的表,其中有一列称为版本。每个已运行的迁移都会有一行。如果磁盘上有一个迁移文件,其时间戳不包含在 schema_migrations 表中,那么 Rails 知道需要运行迁移。

【讨论】:

  • 我不知道你是怎么知道的——官方指南没有说一句话:guides.rubyonrails.org/active_record_migrations.html
  • 嗯,过去 14 年我一直在全职使用 Rails,所以对它的工作原理非常熟悉。 schema_migration 实际上是在迁移指南的“旧迁移”部分中提到的。
猜你喜欢
  • 1970-01-01
  • 2013-07-30
  • 2019-03-12
  • 2017-08-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多