在gem中定义的MIgration未被执行

时间:2012-11-06 01:36:08

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

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

我正在使用带有rails 3.1.3的ruby 1.9.2p320并且因为我直接从文件系统使用它而不应该有错误的gem版本的问题(虽然我已经尝试安装/更新通过捆绑)。

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

修改 gem中的迁移定义为它们通常在任何rails应用程序中定义:

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

1 个答案:

答案 0 :(得分: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