【问题标题】:MIgration defined in gem not being executed未执行 gem 中定义的迁移
【发布时间】:2012-11-06 01:36:08
【问题描述】:

我向(现有的)gem 添加了一个新迁移,并且在运行 rake db:migrate 命令时迁移被完全忽略。我尝试使用 rake db:migrate:redo VERSION=[my migration version] 强制它运行,但它报告它找不到该版本的迁移。

我正在使用带有 rails 3.1.3 的 ruby​​ 1.9.2p320,并且由于我直接从文件系统使用它,因此使用错误的 gem 版本应该没有问题(尽管我已经尝试安装/更新通过捆绑包)。

另外,我不确定在 gem 上定义迁移是否是正确的方法,但由于这个库与 rails 站点高度耦合,特别是因为它是遗留代码,我不会除非绝对必要,否则将其移开。

编辑: gem 中的迁移被定义为它们通常在任何 Rails 应用程序中定义:

gem_folder
   |
   |- db
  ...  |
       |- migrate
            |
            |- <migration files>
                     ...

【问题讨论】:

  • “在 gem 上定义迁移”是什么意思?您可以在迁移中显示代码吗?

标签: ruby-on-rails gem rails-migrations


【解决方案1】:

我发现了问题:在 gem 中专门定义了一个 rake 任务来运行这些迁移。包括代码以防万一它对其他人有用。

namespace :db do
  namespace :migrate do
    description = "Migrate the database through scripts in <gem name>/db/migrate and update db/schema.rb by invoking db:schema:dump. Target specific version with VERSION=x. Turn off output with VERBOSE=false."

    desc description
    task :admin => :environment do
      ActiveRecord::Migration.verbose = ENV["VERBOSE"] ? ENV["VERBOSE"] == "true" : true
      if Gem.searcher.find('<gem name>')
        dir = "#{Gem.searcher.find('<gem name>').full_gem_path}/db/migrate/"
        ActiveRecord::Migrator.migrate(dir, ENV["VERSION"] ? ENV["VERSION"].to_i : nil)
      else
        raise "Unable to locate <gem name> gem to run admin migrations"
      end
      Rake::Task["db:schema:dump"].invoke if ActiveRecord::Base.schema_format == :ruby
    end
  end
end

【讨论】:

  • 这是在 gem 的 Rakefile 中定义的吗?
猜你喜欢
  • 2018-11-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-10-14
  • 2021-03-21
  • 2014-11-19
  • 2020-10-08
  • 2017-01-29
相关资源
最近更新 更多