0

我向(现有)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>
                     ...
4

1 回答 1

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
于 2012-11-06T12:57:54.313 回答