Ответ 1
Используя migration_template в Rails в качестве примера, вы можете проверить destination = self.class.migration_exists?(migration_dir, @migration_file_name)
, и если миграция уже существует, пропустите вызов migration_template
.
Я строю двигатель 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
Я хочу, чтобы он просто молча игнорировал тот факт, что там уже есть миграция и продолжайте переход к следующей миграции. Каким будет лучший способ сделать это?
EDIT:
По словам Дмитрия, это было мое решение:
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
Используя migration_template в Rails в качестве примера, вы можете проверить destination = self.class.migration_exists?(migration_dir, @migration_file_name)
, и если миграция уже существует, пропустите вызов migration_template
.