有没有办法动态设置数据库名称(最初来自 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")
....