如果您在给定环境中使用多个数据库(例如,跨数据库的分片表),是否可以使用内置的Rails rake tasks来操作超出主环境的数据库?
e.g。如果我对一组模型使用特定的connection details,我可以使用rake db:create
来创建所述数据库吗?
若然,怎么样?
答案 0 :(得分:1)
我实际上已经覆盖了内置的Rails rake任务,以便操纵第二个数据库。整洁的是它完全适用于原始的rake任务。
这就是我所做的......归功于Nikolay Sturm,因为我的rake任务是基于他的博客。
我在database.yml中添加了新的数据库设置,详见我链接的博客。
您还可以创建具有以下数据库设置的基本模型:
class BaseModel < ActiveRecord::Base
establish_connection "database_connection_name"
self.abstract_class = true #you want to make this an abstract class because you don't have a table for this
end
然后,任何连接到此辅助数据库的模型都将从BaseModel继承。
在您的rake任务中,您将其设置如下(请记住这是Postgres连接。)
namespace :db do
desc 'create database'
task create: :environment do
connection_config = BaseModel.connection_config #rename BaseModel to name of your model
ActiveRecord::Base.establish_connection connection_config.merge('database => 'postgres') #you don't need this bit if you're not using Postgres
ActiveRecord::Base.connection.create_database connection_config[:database], connection_config
ActiveRecord::Base.establish_connection connection_config
end
desc 'migrate database'
task migrate: :environment do
ActiveRecord::Base.establish_connection BaseModel.connection_config
ActiveRecord::Migrator.migrate('db/migrate/')
end
desc 'drop database'
task drop: :environment do
connection_config = BaseModel.connection_config
ActiveRecord::Base.establish_connection connection_config.merge('database' => 'postgres')
ActiveRecord::Base.connection.drop_database connection_config[:database]
end
现在,如果你在项目中执行rake -T,你应该能够看到rake任务的描述而不是默认值。运行它们时,它将为默认数据库和辅助数据库运行db:create,db:migrate和db:drop。希望这有帮助!