通过生成器将新的迁移从Rails引擎gem添加到app

Jam*_*ren 13 ruby gem ruby-on-rails rails-engines ruby-on-rails-3.2

我正在用红宝石制作一个Rails引擎.它包括现在运行时调用的一些迁移:

rails g myengine:install
Run Code Online (Sandbox Code Playgroud)

生成器中的代码如下:

module MyEngine
  module Generators
    class InstallGenerator < ::Rails::Generators::Base
      include Rails::Generators::Migration

      source_root File.expand_path('../templates', __FILE__)

      # ...

      def copy_migrations
        migration_template "migrations/migration1.rb", "db/migrate/migration1.rb"
        migration_template "migrations/migration2.rb", "db/migrate/migration2.rb"
      end

      # ...
    end
  end
end
Run Code Online (Sandbox Code Playgroud)

但是,如果我rails g myengine:install再次运行,则会因此错误而失败:

Another migration is already named migration1: /Users/jh/Code/Web/demoapp/db/migrate/20130327222221_migration1.rb
Run Code Online (Sandbox Code Playgroud)

我希望它只是默默地忽略已经迁移并继续下一次迁移的事实.最好的方法是什么?

编辑:

根据德米特里的回答,这是我的解决方案:

  def copy_migrations
    copy_migration "migration1"
    copy_migration "migration2"
  end

protected

  def copy_migration(filename)
    if self.class.migration_exists?("db/migrate", "#{filename}")
      say_status("skipped", "Migration #{filename}.rb already exists")
    else
      migration_template "migrations/#{filename}.rb", "db/migrate/#{filename}.rb"
    end
  end
Run Code Online (Sandbox Code Playgroud)

Dmi*_*kel 7

使用migration_template Rails中为例,你也许可以检查destination = self.class.migration_exists?(migration_dir, @migration_file_name),如果迁移已经存在,跳过进行migration_template通话.