Добавить новые миграции из гема движка Rails в приложение через генератор

Я создаю движок Rails в рубиновом камне. Он включает в себя некоторые миграции прямо сейчас, которые вызываются при запуске:

rails g myengine:install

Код в генераторе выглядит следующим образом:

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

Однако, если я снова запущу rails g myengine:install, произойдет сбой с этой ошибкой:

Another migration is already named migration1: /Users/jh/Code/Web/demoapp/db/migrate/20130327222221_migration1.rb

Я хочу, чтобы он просто молча игнорировал тот факт, что миграция уже существует, и переходил к следующей миграции. Как это лучше всего сделать?

ИЗМЕНИТЬ:

Согласно ответу Дмитрия, это было мое решение:

  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

person Jamon Holmgren    schedule 27.03.2013    source источник
comment
@Mischa, у меня в реальном приложении есть значимые имена. Это не помогает, когда вы повторно запускаете генератор установки для его обновления.   -  person Jamon Holmgren    schedule 01.04.2013
comment
Ах я вижу. Рад, что вы решили это...   -  person Mischa    schedule 02.04.2013


Ответы (1)


Используя в качестве примера migration_template в Rails, вы, возможно, могли бы проверить наличие destination = self.class.migration_exists?(migration_dir, @migration_file_name) и, если миграция уже существует, пропустите вызов migration_template.

person Dmitry Frenkel    schedule 31.03.2013
comment
migration_exists? работал. Спасибо. лишь бы очистить. migration_exists? принимает два строковых параметра. @migration_file_name доступен только внутри файла шаблона - person Saad Masood; 20.05.2015