@Vasily さん、ご返信ありがとうございます。それを読んで、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 ディレクトリに作成されます。
次に、db/migrations/custom ディレクトリからすべての移行を実行する通常の rails migration を作成しました。
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")