namespace :seconddo namespace :dbdo|ns| %i[drop create setup migrate rollback seed version].each do|task_name| task task_name do Rake::Task["db:#{task_name}"].invoke end end
namespace :schemado %i[load dump].each do|task_name| task task_name do Rake::Task["db:schema:#{task_name}"].invoke end end end
namespace :testdo task :preparedo Rake::Task['db:test:prepare'].invoke end end
# 向上面定义的所有任务追加和添加适当的任务 ns.tasks.each do|task| task.enhance ['second:set_custom_config'] do Rake::Task['second:revert_to_original_config'].invoke end end end
task :set_custom_configdo # save current vars @original_config = { env_schema: ENV['SCHEMA'], config: Rails.application.config.dup }
# set config variables for custom database ENV['SCHEMA'] = 'db_second/schema.rb' Rails.application.config.paths['db'] = ['db_second'] Rails.application.config.paths['db/migrate'] = ['db_second/migrate'] Rails.application.config.paths['db/seeds.rb'] = ['db_second/seeds.rb'] Rails.application.config.paths['config/database'] = ['config/second_database.yml'] end
task :revert_to_original_configdo # reset config variables to original values ENV['SCHEMA'] = @original_config[:env_schema] Rails.application.config = @original_config[:config] end end
这个时候使用rails second:db:create就能看到如下效果:
$ rails second:db:create Created database 'second_development' Created database 'second_test'
并且会生成db_second/schema.rb文件
4. 新建db_second_migration生成器
为了使用类似rails g migration xxxx的功能来创建项目外数据库的迁移管理文件,我们必须新增一个属于项目外数据库的迁移生成器,并让这个生成器继承于ActiveRecord::Generators::MigrationGenerator