一个应用程序,但不同的yml文件

时间:2014-02-03 06:42:03

标签: ruby-on-rails

我有10个应用程序在同一个git标签上运行,这意味着除了在数据库设置中有变化的config / database.yml之外,应用程序端没有任何变化。

这会占用服务器上的大量空间,并且存在可伸缩性问题。那么,是否可以为同一个应用程序的其余9个实例克隆一个应用程序并使用不同的yml文件。可以应用软链接方法。

3 个答案:

答案 0 :(得分:0)

如果我理解你的问题, 您的问题只是从同一个应用程序连接到不同的数据库,在这种情况下,您可以检查从一个主应用程序连接多个dbs的方法。阅读本文

http://my.safaribooksonline.com/book/web-development/ruby/9780596510329/database/connecting_to_multiple_databases

Rails中有很多宝石可以让你轻松完成。这里

https://github.com/cherring/connection_ninja

http://magicmodels.rubyforge.org/magic_multi_connections/

http://rubygems.org/gems/contineo

这样,您只需要一个database.yml文件,并为所有实例添加所需的数据库数量。

希望它有所帮助!

答案 1 :(得分:0)

如果所有网站的应用程序逻辑相同,那么路由也是相同的,只有几种方法可以区分彼此:

  1. 为每个应用程序使用不同的端口以及相应的apache / nginx映射。 在这里,您必须为每个端口使用一个正在运行的应用程序。

    www.domain-1.com - >本地主机:3001 www.domain-2.com - > localhost:3002 等等。

    这就是你现在拥有的。

  2. 为一个应用中的每个网站使用不同的控制器 。 Apache / nginx映射将映射到仅一个应用程序

    www.domain-1.com - >本地主机:3000 www.domain-2.com - > localhost:3000 等等。

    您可以在routes.rb(http://guides.rubyonrails.org/routing.html)确定适当的控制器。

    可能是这样的:

    <强> routes.rb中:

    require 'domain'
    constraints(Domain) do
      match '/' => 'controller-1#action'
    end
    

    <强>顾虑/ domain.rb:

    class Domain
      def self.matches?(request)
        request.domain.present? && request.domain == "www.domain-1.com"
      end
    end
    

    对于yml文件,您也可以将它们合并到一个应用程序中。

答案 2 :(得分:0)

一个应用程序,但不同的yml文件

只需更新问题中给出的database.yml文件即可。假设我们的开发实例是 development-1,development-2,development-3和development-4。

首先,您只需创建环境文件development-1.rb的3个副本(可以找到insideconfig / environments /)并将其重命名为development-2.rbdevelopment-3.rbdevelopment-4.rb

然后,在启动服务器之前,请执行以下步骤。

RAILS_ENV=development rake db:create 
//(OR just rake db:create as it defaults to development)
RAILS_ENV=development-2 rake db:create
RAILS_ENV=development-3 rake db:create
RAILS_ENV=development-4 rake db:create

RAILS_ENV=development rake db:schema:load 
//(OR just rake db:schema:load as it defaults to development)
RAILS_ENV=development-2 rake db:schema:load
RAILS_ENV=development-3 rake db:schema:load
RAILS_ENV=development-4 rake db:schema:load

RAILS_ENV=development rake db:seed 
//(OR just rake db:seed as it defaults to development)
RAILS_ENV=development-2 rake db:seed
RAILS_ENV=development-3 rake db:seed
RAILS_ENV=development-4 rake db:seed

然后,使用下面给出的不同服务器pid启动所有实例。

rails s -p 3000 -e development --pid tmp/pids/server.pid (OR rails s by default)
rails s -p 3002 -e development-2 --pid tmp/pids/server.2.pid
rails s -p 3003 -e development-3 --pid tmp/pids/server.3.pid
rails s -p 3004 -e development-4 --pid tmp/pids/server.4.pid

这将同时从同一个源和单个database.yml文件启动所有实例。

您也可以像往常一样将连接详细信息放在database.yml中,其名称如下:

*的 log_database_producion:*

adapter: mysql
  host: other_host
  username: logmein
  password: supersecret
  database: logs

然后在您的特殊模型中:

class AccessLog < ActiveRecord::Base
  establish_connection "log_database_#{Rails.env}"
end

将这些令人讨厌的凭据保留在您的应用程序代码中。

如果要在多个模型中重用此连接,则应创建一个新的抽象类并从中继承,因为连接与类紧密耦合(如此处,此处和此处所述),并且将创建新连接每个班级。

如果是这种情况,请按以下方式进行设置:

class LogDatabase < ActiveRecord::Base
  self.abstract_class = true
  establish_connection "log_database_#{Rails.env}"
end

class AccessLog < LogDatabase
end

class CheckoutLog < LogDatabase
end

按照模型的标准Rails命名约定在app_1 / models文件夹中创建一个新文件,在这种情况下,该模型将是一个名为a_table.rb的文件,因为它连接到一个名为a_table的表,然后在标准中设置类定义Rails模型格式如此

class ATable < ActiveRecord::Base
end

但是tha模型如何知道与国外数据库交谈?

您需要做的就是将establish_connection声明添加到类中,以便最终得到

class ATable < ActiveRecord::Base
  establish_connection "foreign_#{Rails.env}"
end

就像magick一样,在ATable下运行app 1的任何环境都会在app 1的database.yml文件中获取相应的环境条目 例如当在上面的示例中以生产模式运行时,a_table将自动连接到foreign_production条目。

我发现创建一个单独的应用程序对我的需求来说太过分了。应用程序本身只会添加迁移,不需要任何视图,控制器,帮助程序等......只是一个模型和运行迁移的能力。

http://archive.railsforum.com/viewtopic.php?id=42143

http://blog.bitmelt.com/2008/10/connecting-to-multiple-database-in-ruby.html

https://www.digitalocean.com/community/questions/connecting-to-database-on-a-different-server

https://github.com/rails/rails/issues/7019

https://github.com/laserlemon/figaro

http://guides.rubyonrails.org/i18n.html