2013-03-10 56 views
2

我已經設置了一個簡單的「設置」模型,因此我可以創建一些用戶可修改的全局變量,我可以在整個應用程序中使用這些全局變量。 該模型有var_namevalue列。 var_name是主鍵。將數據庫查詢保存到變量

我可以訪問這些使用Setting.find('my_variable_name'),它工作,但每次都會導致數據庫查詢。

我希望能夠'緩存'設置一次,而不是每次查詢數據庫。
我不確定正確的方式去做這件事,我還是Rails新手。

我想象像settings = Setting.all在我的應用程序控制器,把所有的設置在一個變量,然後創建一個方法來操縱單個變量出來的 - 使用類似settings.my_variable_name叫它...
......但是我不知道如何:)

任何意見,將不勝感激。謝謝。

回答

4

嘗試增加此爲您設置的模式,

class Setting < ActiveRecord::Base 
    def self.fetch(name) 
    fetch_all.detect { |s| s.var_name == name } 
    end 

    def self.fetch_all 
    @fetch_all ||= Setting.all 
    end 

    def self.reload_all! 
    @fetch_all = Setting.all 
    end 
end 

創建一些設置,

Setting.create(var_name: 'domain', value: 'google.com') 
Setting.create(var_name: 'subdomain', value: 'www') 

然後,您可以獲取使用Setting.fetch('domain').value #=> 'google.com'的設置。

Settings.fetch('domain') #=> Hits the database with Settings.all 
Settings.fetch('subdomain') #=> Hits the results in @fetch_all 
Settings.fetch('domain') #=> Hits the results in @fetch_all 

@fetch_all ||= all將調用Setting.all首次Setting.fetch_all被調用,結果存儲在@fetch_all。隨後的呼叫將使用存儲在@fetch_all中的結果。

+0

作品。看上去對我優雅。謝謝。雖然因爲我有'var_name'作爲主鍵,所以我需要將代碼的第3行從's.var_name'更改爲'sid' – 2013-03-10 00:51:46

+0

實際上,當您更新數據庫中的某個變量時,fetch方法將返回較舊的值。我怎樣才能獲得新的價值? – 2013-03-10 02:01:45

+0

您可以添加一個名爲'self.refresh'的新方法來執行'@fetch_all = Settings.all'。 – Sam 2013-03-10 02:06:19