2

我正在构建一个允许用户通过管理前端界面修改 database.yml 内容的系统。

在重新启动应用程序之前,对 database.yml 的更改显然没有任何影响。与其强迫用户(可能没有对物理框的 SSH 访问权限)手动重新启动应用程序,我想要一种强制 ActiveRecord 在启动后重新加载配置的方法。

有没有办法强制 ActiveRecord 在初始启动后重新初始化,而不是要求他们重新启动服务器?

基本原理

这有两个用例 - a) 初始设置向导 b) 从 sqlite 评估数据库移动到生产支持的数据库。

初始设置向导

在安装我们的应用程序并首次启动后,用户将看到一个设置向导,其中允许用户在使用 sqlite 的内置评估数据库或指定生产支持的数据库之间进行选择。他们需要指定数据库属性。我们不希望用户在服务器上编辑yml文件,而是希望当前的前端在初始设置期间这样做。

从 sqlite 评估数据库迁移到生产支持数据库

如果用户选择使用内置评估数据库,但 alter 想要迁移到生产数据库,他们需要更新数据库设置以反映此更改。与上述相同的原因,需要一个前端而不是要求用户编辑配置文件,特别是因为我们可以验证应用程序的连接性、权限等,而不是用户在尝试启动应用程序时发现它不起作用他们得到一个 activerecord 异常。

4

3 回答 3

1

在下一个请求时重新启动 Rails 堆栈,就像您可以访问服务器一样。

system("touch #{File.join(Rails.root,'tmp','restart.txt')")
于 2013-01-19T05:31:26.923 回答
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]
于 2018-05-09T15:49:36.640 回答
0

从理论上讲,您可以通过以下方式实现此目的:

config = YAML::load File.read(File.join(Rails.root, "config/database.yml"))

ActiveRecord::Base.establish_connection config[Rails.env]

您必须在运行的每个 rails 进程中执行重新连接代码才能使其生效。不过,这里有很多危险的事情需要担心——更改数据库配置时的竞争条件、新 database.yml 中的语法问题等。

于 2013-01-18T23:55:51.123 回答