複数のdatabaseもきちんとmigrationを使って管理したいです。
たとえば foo
というデータベースを追加で管理したい場合、以下のようなrakeタスクを作ることで良い感じに運用できます。
lib/tasks/database_foo.rake
namespace :foo do
desc "Configure the variables that rails need in order to look up for the db
configuration in a different folder"
task :set_custom_db_config_paths do
ENV['SCHEMA'] = 'db_foo/schema.rb'
Rails.application.config.paths['db'] = ['db_foo']
Rails.application.config.paths['db/migrate'] = ['db_foo/migrate']
Rails.application.config.paths['db/seeds.rb'] = ['db_foo/seeds.rb']
Rails.application.config.paths['config/database'] = ['config/database_foo.yml']
ActiveRecord::Migrator.migrations_paths = 'db_foo/migrate'
end
namespace :db do
task drop: :set_custom_db_config_paths do
Rake::Task["db:drop"].invoke
end
task create: :set_custom_db_config_paths do
Rake::Task["db:create"].invoke
end
task migrate: :set_custom_db_config_paths do
Rake::Task["db:migrate"].invoke
end
task rollback: :set_custom_db_config_paths do
Rake::Task["db:rollback"].invoke
end
task reset: :set_custom_db_config_paths do
Rake::Task['db:drop'].invoke
Rake::Task['db:create'].invoke
Rake::Task['db:migrate'].invoke
end
task seed: :set_custom_db_config_paths do
Rake::Task["db:seed"].invoke
end
task version: :set_custom_db_config_paths do
Rake::Task["db:version"].invoke
end
namespace :test do
task prepare: :set_custom_db_config_paths do
Rake::Task['db:drop'].invoke
Rake::Task['db:create'].invoke
Rake::Task['db:migrate'].invoke
end
end
end
end
railsのルートに
- db_foo
- db_foo/migrate/.keep
- db_foo/schema.rb
- db_foo/seeds.rb
を配置します。
もともと db
ディレクトリにあるファイル群と同じです。
それと config/database_foo.yml
を配置します。これももともとある database.yml
と同様のものです。
これでdb周りのタスクが別databaseに対して使えるようになります。
migrateしたい場合には
$ rake foo:db:migrate
となります。