是否可以在辅助数据库上使用Rails rake任务?

时间:2015-09-08 23:21:39

标签: ruby-on-rails rake

如果您在给定环境中使用多个数据库(例如,跨数据库的分片表),是否可以使用内置的Rails rake tasks来操作超出主环境的数据库?

e.g。如果我对一组模型使用特定的connection details,我可以使用rake db:create来创建所述数据库吗?

若然,怎么样?

1 个答案:

答案 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。希望这有帮助!