2013-01-18 28 views
1

我正在構建一個允許用戶通過管理前端界面修改database.yml內容的系統。在rails啓動後重新初始化ActiveRecord

在應用程序重新啓動之前,對database.yml的更改顯然沒有任何影響。而不是強制用戶(可能沒有SSH訪問物理盒)來手動重新啓動應用程序,我想要一種方法來強制ActiveRecord重新啓動config post。

而不是要求他們重新啓動服務器,是否有辦法強制ActiveRecord重新初始化後初始化?

理由

有兩個用例這 - 一個)初始設置嚮導b)由源碼評價數據庫移動到生產支持的數據庫。

初始設置嚮導

安裝我們的應用程序,並開始它的第一次用戶將一個設置嚮導,其中除其他事項外,允許用戶在內置的評價數據庫之間的選擇呈現之後使用sqlite或指定生產支持的數據庫。他們需要指定數據庫屬性。我們不希望用戶在服務器上編輯yml文件,而是希望在初始設置過程中使用前端。

從sqlite的評價數據庫移動到生產支持的數據庫

如果用戶選擇去與內置的評估數據庫,但修改要遷移到他們需要更新的數據庫設置來反映生產數據庫這個變化。與上述相同的原因,前端而不是要求用戶編輯配置文件是需要的,尤其是因爲我們可以驗證應用程序的連接性,權限等,而不是用戶在嘗試啓動應用程序時發現它不工作並且他們得到一個activerecord異常。

+1

這似乎是一個可怕的想法。 – coreyward

+0

請詳細說明你爲什麼這麼認爲。 –

+0

請詳細說明你這樣做的原因。 – coreyward

回答

0

從理論上說,你可以用下面的實現:

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

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

你不得不在每個軌道處理你運行它是有效執行重新連接的代碼。在這裏有一堆危險的東西需要擔心 - 更改數據庫配置時的競爭條件,新的database.yml中的語法問題等。

1

在下一個請求中重新啓動您的Rails堆棧,就像您有訪問服務器。

system("touch #{File.join(Rails.root,'tmp','restart.txt')") 
+0

謝謝 - 但我們沒有運行乘客 –