【问题标题】:Run ActiveRecord migrations without Rails在没有 Rails 的情况下运行 ActiveRecord 迁移
【发布时间】:2018-02-21 19:15:29
【问题描述】:

我正在尝试更新一个名为 textacular 的 gem,以与最新的 rails 版本兼容。

在开发 Rake 任务中,我们需要运行一些 ActiveRecord 迁移 - 没有 Rails。

今天看起来像:

namespace :migrate do
    desc 'Run the test database migrations'
    task :up => :'db:connect' do
      ActiveRecord::Migrator.up 'db/migrate'
    end

    desc 'Reverse the test database migrations'
    task :down => :'db:connect' do
      ActiveRecord::Migrator.down 'db/migrate'
    end
end

但是,当使用 ActiveRecord >= 5 时,它会失败:

NoMethodError: undefined method 'up' for ActiveRecord::Migrator:Class.

我试图查看 ActiveRecord 的源代码,尝试了很多不同的方法,但都没有成功运行迁移。

有人知道该怎么做吗?

编辑

使用ActiveRecord::Migration.up 没有任何作用,可能只是基于方法的returns

使用ActiveRecord::Migration.migrate(:up) 给出输出:

==  ActiveRecord::Migration: migrating ========================================
==  ActiveRecord::Migration: migrated (0.0000s) ===============================

所有迁移都在文件夹db/migrate中。

【问题讨论】:

  • 您使用的是哪个 Rails 版本的 Migration-class?
  • 根本不使用Rails,目前只使用activerecord (5.1.5)。 @AndresEhrenpreis

标签: ruby-on-rails ruby activerecord


【解决方案1】:

你也可以使用这个命令:

ActiveRecord::MigrationContext.new(Rails.root.join('db', 'migrate'), ActiveRecord::SchemaMigration).migrate

【讨论】:

    【解决方案2】:

    我设法解决了这个问题(至少在 Rails 6 发布之前),可以在 textacular 上看到实现

    task :up => :'db:connect' do
      migrations = if ActiveRecord.version.version >= '5.2'
        ActiveRecord::Migration.new.migration_context.migrations
      else
        ActiveRecord::Migrator.migrations('db/migrate')
      end
      ActiveRecord::Migrator.new(:up, migrations, nil).migrate
    end
    

    对这个解决方案不太满意,但这是我能让迁移在 Rails 5、5.1 和 5.2 上运行的唯一方法。

    【讨论】:

      【解决方案3】:

      通过查看rails github page,然后从Rails 5.2 开始,Migrator class 被减少了很多。它的大部分方法都转移到了Migration class(包括.up method)。

      因此只需将ActiveRecord::Migrator 替换为ActiveRecord::Migration

      【讨论】:

      • 感谢您的回答!我已经尝试过这种方法,但是很遗憾,没有完成任何迁移。我将输出添加到我原来的问题中。
      猜你喜欢
      • 2021-10-22
      • 2015-04-29
      • 1970-01-01
      • 1970-01-01
      • 2020-12-06
      • 2015-11-06
      • 1970-01-01
      • 1970-01-01
      • 2011-03-27
      相关资源
      最近更新 更多