我正在构建一个允许用户通过admin前端界面修改database.yml内容的系统。
在重新启动应用程序之前,对database.yml的更改显然没有任何影响。而不是强迫用户(可能没有物理盒的SSH访问权限)手动重新启动应用程序,我想要一种强制ActiveRecord重新加载配置文件启动时的方法。
有没有办法强制ActiveRecord在初次启动后重新初始化?
而不是要求他们重新启动服务器?原理
这有两个用例 - a)初始设置向导b)从sqlite评估数据库转移到生产支持的数据库。
初始设置向导
安装我们的应用程序并首次启动后,将向用户显示一个设置向导,其中包括允许用户在使用sqlite的内置评估数据库之间进行选择或指定生产支持的数据库。他们需要指定数据库属性。而不是要求用户在服务器上编辑yml
文件,我们希望在初始设置期间提供一个前端。
从sqlite评估数据库迁移到生产支持的数据库
如果用户选择使用内置评估数据库,但是alter想要迁移到生产数据库,则需要更新数据库设置以反映此更改。与上述相同的原因,需要前端而不是要求用户编辑配置文件,特别是因为我们可以从应用程序验证连接,权限等,而不是用户在尝试启动应用程序时发现它不起作用他们得到了一个积极的记录例外。
答案 0 :(得分:1)
在下一个请求中重新启动Rails堆栈,就像访问服务器一样。
system("touch #{File.join(Rails.root,'tmp','restart.txt')")
答案 1 :(得分:1)
在@ wless1的答案基础上,为了获得类似ERB的ENV变量(例如<%= ENV['DB_HOST'] %>
),请尝试以下方法:
YAML::load(ERB.new(File.read(File.join(Rails.root, "config/database.yml"))).result)
ActiveRecord::Base.establish_connection config[Rails.env]
答案 2 :(得分:0)
理论上,您可以通过以下方式实现此目的:
config = YAML::load File.read(File.join(Rails.root, "config/database.yml"))
ActiveRecord::Base.establish_connection config[Rails.env]
您必须在正在运行的每个rails进程中执行重新连接代码才能使其生效。这里有一堆危险的事情需要担心 - 更改数据库配置时的竞争条件,新数据库中的语法问题等。