2011-03-17 193 views
4

我想實例化一個可以通過所有應用程序訪問的數組,數組可能會在應用程序運行時發生更改,但應用程序再次啓動時會重新生成該數組。Ruby on Rails全局數組

雖然我已經把這個數組放在ApplicationController中,但是一旦請求結束就會死掉?我只需要它在每次應用程序開始運行時填充一次,而不是每次調用控制器操作。

該數組從數據庫中填充並且必須已經加載。

在此先感謝您的任何指導。

+0

如果你確實使用全局(記住它只是* PER-PROCESS *),至少給它一個單獨的名稱空間,例如它可能被稱爲'MyGlobals :: stats'或whatnot。但最好有可能將它包裝在一個單獨的對象中(不,不是*,那就是*類型的單例...)然後:'MyStats.add_stat(etc)' – 2011-03-17 16:41:31

+1

如果你有多個應用程序運行,應該可以訪問所有他們?例如,在服務器上,您可能同時運行5個rails應用程序,並且它們都不共享內存。 – 2011-03-17 16:41:59

+0

我忘了說數組是從數據庫中填充的,所以必須先初始化。 – 2011-03-17 16:43:11

回答

4

您可以創建一個簡單的類來保留這些信息給你。例如,您可以添加如下配置/初始化/ my_keep.rb:

class MyKeep 
    def self.the_array 
    @@the_array ||= # Execute the SQL query to populate the array here. 
    end 

    def self.add element 
    if @@the_array 
     @@the_array << element 
    else 
     @@the_array = [element] 
    end 
    end 
end 

在您的應用程序,你叫MyKeep.the_array陣列將被從數據庫中填充,所以你甚至可以做到這一點在第一時間相同的文件或在application.rb文件中的after_initialize塊中。然後,您可以使用MyKeep.add(element)添加數組,您將可以使用MyKeep.the_array獲取數組值。每個請求都不應該重新設置這個類。

+0

實際上它是一個模型,它不一定是一個數組,我從couchdb預加載文件,以便我可以進行全文搜索。 – 2011-03-17 17:15:39

+0

那很好。不管你想要什麼,你都可以修改這個類。沒有必要使用數組。該解決方案允許您保留最初從數據庫預加載的變量,並在整個應用程序生命週期中添加該變量。你應該修改它以適合你的用例。 – 2011-03-17 17:48:06

+0

不,不起作用。 – 2013-06-17 08:20:57

5

在裏面創建一個文件config/initializers叫做whatever-want-want.rb並在那裏放置代碼。

THIS_IS_AN_ARRAY = [1,2,3,4]

然後,您應該能夠訪問THIS_IS_AN_ARRAY在你的應用程序。