@ Спасибо Василию за ваш ответ. Прочитав его и пару вопросов от stackoverflow, я пришел к следующему решению:
Поскольку я пишу свой собственный генератор для создания пользовательских таблиц, я включил в него Rails :: Generators :: Migration, чтобы я мог переопределить метод next_migration_number следующим образом:
def self.next_migration_number(dirname)
if ActiveRecord::Base.timestamped_migrations
Time.now.utc.strftime("custom/%Y%m%d%H%M%S")
else
"custom/%.3d" % (current_migration_number(dirname) + 1)
end
end
Теперь все миграции, созданные пользователем, создаются в каталоге db / migrations / custom.
Затем я написал обычную миграцию rails, которая выполняет все миграции из каталога db / migrations / custom:
class ExecuteCustomMigrations < ActiveRecord::Migration
MIGRATIONS_PATH='db/migrate/custom'
def self.up
Dir["#{MIGRATIONS_PATH}/[0-9]*_*.rb"].
sort.map{|filename|require filename}.flatten.
each{|class_name| const_get(class_name).up}
end
def self.down
Dir["#{MIGRATIONS_PATH}/[0-9]*_*.rb"].sort.reverse.
map{|filename|require filename}.flatten.
each{|class_name| const_get(class_name).down}
end
end
После того, как пользователь создает пользовательскую таблицу, я вызываю эту миграцию с таким кодом:
Rake::Task["db:migrate:redo"].execute("VERSION=20110108213453")