2011-10-06 28 views
2

我有一個來自第三方數據庫的現有表,我掛鉤存儲鍵/值對。兩列,一列爲「param」,另一列爲「paramvalue」。我需要爲我正在開發的一個插件應用程序訪問這些存儲的值,並且我正在嘗試考慮將值最容易地應用於整個應用程序的最簡單格式。我曾經想過的是以某種方式在AR模型中構建動態方法,我可以根據參數名稱進行調用。像SysParams.base_url,它將映射到[base_url,http://www.thesite.com]的記錄。有點像Record.find_by_column_name的內置AR方法使用ActiveRecord與鍵/值對錶

最終的問題:是這樣的可能嗎?如果是這樣,這是一個好主意嗎?如果是這樣,一個人會怎麼做呢?

+0

您的第三方數據庫發生了變化,還是鍵/值對不變?如果它們不變,你有多少個k/v對?許多?數百?成千上萬的? – sled

+0

好問題。我不認爲數據庫變化很大。該表中目前少於25個條目。鍵/值不是以用戶可訪問的任何方式設置的,只是管理員可以直接訪問數據庫,所以鍵/值應該在很大程度上是可預測的。 – John

+0

也許模型中的元方法可以將關鍵字名稱作爲參數傳遞給我,這對我來說會更容易一些。就像,SysParam.getsetting('keyname')會返回值。 – John

回答

1

這是我如何處理這些東西,但這只是一個好主意,如果密鑰的數量不是太大。

1.創建一個模型來訪問你的數據庫像這樣的:

應用程序/模型/ config_table.rb

class ConfigTable < ActiveRecord::Base 
    # whatever you need here 
end 

2.創建一個初始化

配置/初始化/ ADMIN_CONFIG。 rb

class AdminConfig 
    # uncomment this if in development 
    #unloadable 

    # I assume you have the fields key/value in your 
    # ConfigTable you may need to change this 

    def self.all 
    # create a cached hash 
    @cache ||= ConfigTable.all.inject({}) do |hsh, c_config| 
     hsh[c_config.key.to_sym] = c_config.value 
     hsh 
    end 
    end 

    def self.get(key) 
    self.all[key.to_sym] 
    end 

    def self.[](key) 
    self.all[key.to_sym] 
    end 
end 

用法示例(您的Appp中的任何位置):

AdminConfig.get(:hostname) 
AdminConfig.get('hostname') 
AdminConfig[:hostname] 
AdminConfig['hostname'] 

如果由於更改需要重新加載配置,則必須重新啓動所有正在運行的應用程序實例。您可能需要修改表格/列的名稱當然:)

如果您需要更大的鍵/值集合的解決方案,我建議您將它存儲在導軌的緩存中,也可以使用redis-store: )

玩得開心

+0

這樣做。我認爲一個散列值/鍵集可能會在某種程度上出現,但不確定將它放在哪裏或如何正確讀取它。非常感謝! – John