1

有没有办法动态设置数据库名称(最初来自 database.yml),最好使用应用程序路径名的一部分?

问题的背景是,我有一个源代码,它应该在同一个服务器上多次运行,但应用程序的每个实例都应该有一个不同的数据库。

例如,我有一个使用货币 USD 的拍卖网站。现在我想再次运行相同的拍卖网站(一个相同的服务器)以获得第二种货币。出于正当理由,我不想让应用程序支持多币种,我想保持源代码不变。

使用子 URL 在同一服务器上设置应用程序我将遵循这种方法: http ://www.modrails.com/documentation/Users%20guide%20Apache.html#deploying_rack_to_sub_uri

剩下的问题是,应用程序的每个实例如何获得自己的数据库名称,例如,一个实例使用数据库名称 production_USD,另一个使用 production_CAD


编辑:由于收到的反馈,该解决方案就像一个魅力:

我在服务器上的文件夹结构是

/var/www/auction/USD-US Dollar
/var/www/auction/CAD-Canadian Dollar
/var/www/auction/source
/var/www/logs

使用包含原始源代码的源文件夹以及指向源代码的 USD 和 CAD(实际上不需要将任何代码复制到任何地方,除了将其放入源代码中。

接下来动态设置数据库。货币是通过查看文件夹名称自动确定的。我在早期将它放入 application.rb 中,因为我还需要不同货币的不同日志文件。我将日志文件存储在源文件夹之外,以确保在从 QA 系统刷新源文件夹时不会丢失它们

这里代码更改:

应用程序.rb:

fname = File.basename(File.expand_path('../../', __FILE__))

curr = fname.split("-")
if curr[1].nil?
  CURR_SHORT = "XXX"
  CURR_LONG  = "XXX"
else
  CURR_SHORT = curr[0]
  CURR_LONG  = curr[1]
end

dbname = "myapp_#{CURR_SHORT}_#{Rails.env[0..2]}"

ActiveRecord::Base.establish_connection(
  :adapter  => "sqlite3",
  :host     => "localhost",
  :username => "myuser",
  :password => "mypass",
  :database => dbname

)

module Virex
  class Application < Rails::Application

    config.logger = ActiveSupport::BufferedLogger.new("../logs/#{Rails.env}.#{CURR_SHORT}.log")

....
4

1 回答 1

1

当然,看看ActiveRecord::Base.establish_connection

ActiveRecord::Base.establish_connection(
  :adapter  => "mysql",
  :host     => "localhost",
  :username => "myuser",
  :password => "mypass",
  :database => "somedatabase"
)

您可以将这段代码放入初始化程序中,并使用您想要的数据库名称,具体取决于您的路径名。

在此处完成文档

于 2013-04-18T12:29:49.377 回答