我们如何使用不同的数据库配置运行Ruby on Rails应用程序?
详细地说,我想在生产环境下运行多个Rails应用程序实例,并为每个实例使用不同的数据库配置。这有可能吗?
我们如何使用不同的数据库配置运行Ruby on Rails应用程序?
详细地说,我想在生产环境下运行多个Rails应用程序实例,并为每个实例使用不同的数据库配置。这有可能吗?
我认为你可以将database.yml中的配置复制到不同的环境中,例如prod1、prod2等,然后在启动每个相应的服务器之前设置RAILS_ENV环境变量以匹配...
establish_connection "database_name_#{RAILS_ENV}"
如此描述:http://apidock.com/rails/ActiveRecord/Base/establish_connection/class
你会有一些模型使用来自一个数据库的表格,而其他不同的模型使用来自其他数据库的表格。
如果你有相同的表格,在不同的数据库上是共用的,并且被单个模型共享,ActiveRecord 将无法帮助你。在 2009 年,我在一个项目中需要这样做,当时我使用的是 Rails 2.3.8。我为每个客户创建了一个数据库,并使用他们的 ID 命名了这些数据库。因此,我创建了一个方法来在 ApplicationController 中更改连接:
def change_database database_id = params[:company_id]
return if database_id.blank?
configuration = ActiveRecord::Base.connection.instance_eval { @config }.clone
configuration[:database] = "database_name_#{database_id}_#{RAILS_ENV}"
MultipleDatabaseModel.establish_connection configuration
end
并将该方法添加为所有控制器的 *before_filter*:
before_filter :change_database
对于每个控制器的每个操作,当params[:company_id]被定义和设置时,它将更改数据库为正确的数据库。
为了处理迁移,我扩展了ActiveRecord::Migration,并使用一个方法查找所有客户并迭代每个ID的块:
class ActiveRecord::Migration
def self.using_databases *args
configuration = ActiveRecord::Base.connection.instance_eval { @config }
former_database = configuration[:database]
companies = args.blank? ? Company.all : Company.find(args)
companies.each do |company|
configuration[:database] = "database_name_#{company[:id]}_#{RAILS_ENV}"
ActiveRecord::Base.establish_connection configuration
yield self
end
configuration[:database] = former_database
ActiveRecord::Base.establish_connection configuration
end
end
你可以像DGM提到的那样复制你的database.yml文件。然而,正确的做法是使用像Chef这样的配置管理解决方案。
如果你查看设置Rails堆栈的指南,它包括2个前端Web服务器+1个后端DB服务器。这将包括你复制database.yml文件的情况。
好的。我们需要在您的应用程序中创建多个环境
创建config/environmenmts/production1.rb
,它将与config/environmenmts/production.rb
相同
然后编辑database.yml以进行production1设置,完成后即可。
使用rails s -e production1
启动服务器
production1
,指向 production.rb
ln -s production.rb production1.rb部署时也可以执行相同的操作。 - Sandip Ransing
config/environments/production.rb
,只需将其重命名为prod1.rb、prod2.rb等。如果您使用capistrano进行部署,则可能需要在cap deploy
命令行上指定-Srails_env=myenvironmentname
。 - riffraff