Ruby on rails,具有多种生产设置

时间:2011-10-04 06:16:34

标签: ruby-on-rails ruby

我们如何在具有不同数据库配置的rails应用程序上运行ruby?

详细说明:我想为生产中的每一个运行具有不同数据库配置的rails应用程序的多个实例。这怎么可能?

4 个答案:

答案 0 :(得分:3)

我认为您可以将database.yml中的配置复制到不同的环境中,例如prod1,prod2 ...然后在启动每个相应的服务器之前设置RAILS_ENV环境变量以匹配...

答案 1 :(得分:0)

您可以像提到的DGM一样复制database.yml文件。但是,正确的方法是使用Chef等配置管理解决方案。

如果查看guide for setting up Rails stack,它包含一个2前端Web服务器+ 1个后端数据库服务器。其中包括复制database.yml文件的情况。

答案 2 :(得分:0)

好。我们必须在您的应用程序中创建多个环境

创建config/environmenmts/production1.rb,与config/environmenmts/production.rb

相同

然后编辑database.yml for production1设置,你就完成了。

使用rails s -e production1

启动服务器

答案 3 :(得分:0)

如果您能够控制和配置每个Rails实例,并且由于它们处于待机状态而您可以负担浪费资源,请省去一些麻烦,只需更改database.yml即可修改每个实例上使用的数据库连接。如果你担心性能,这种方法不会削减它。

对于仅在一个数据库上绑定到单个唯一表的模型,可以在模型中调用establish_connection:

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

请注意,通过执行此操作,您无法在两个不同数据库的同一操作中进行查询。你可以再次调用* change_database *但是当你尝试使用执行查询的方法时,它会变得很讨厌,从不再链接到正确数据库的对象。此外,显然您将无法连接属于不同数据库的表。

为了正确处理这个问题,应该大大扩展ActiveRecord。现在应该有一个插件来帮助您解决这个问题。一个快速的研究给了我这个:

DB-Charmer:http://kovyrin.github.com/db-charmer/

我愿意尝试一下。让我知道什么对你有用。