Ruby on Rails 全局数组

4
我想实例化一个数组,使其可以在整个应用程序中访问。该数组可能会在应用程序运行时更改,但当应用程序再次启动时,它将被重新生成。
我考虑将该数组放入ApplicationController中,但请求结束后它会消失,对吗?我只需要在应用程序启动时填充它一次,而不是每次调用控制器操作时都填充它。
该数组是从数据库中填充的,因此必须已经加载。
感谢您提供任何指导。

如果你确实使用了一个全局变量(记住它只是每个进程的),至少给它一个独立的命名空间,比如可以叫做MyGlobals::stats或其他什么。但最好的方式可能是将其封装在一个单例对象中(不,不是那种单例...),然后使用MyStats.add_stat(etc)这样的方式来操作。 - user166390
1
如果您有多个应用程序正在运行,这个数组是否应该对它们所有人都可访问?例如,在服务器上,您可能同时运行5个Rails应用程序,但它们之间不共享内存。 - Pan Thomakos
我忘了提到这个数组是从数据库中填充的,所以它必须已经被初始化了。 - Salvador Aceves
你提到数组在应用程序运行时可以发生变化。这是你手动赋值的结果,还是你期望以其他方式进行更改? - Pan Thomakos
给Pan:该数组不必对所有线程都可访问,因为这是一个非常低并发的应用程序。 - Salvador Aceves
更多的值可能会被添加到数组中,基本上是一个包含文本和ID的数组,以便我可以进行文本搜索,因此,如果有人添加了新记录,数组将需要插入这条新记录,这样我们就不必重新启动应用程序。 - Salvador Aceves
3个回答

5
在你的config/initializers文件夹中创建一个名为whatever-you-want.rb的文件,并将你的代码放在其中。

THIS_IS_AN_ARRAY = [1,2,3,4]

然后你就可以在整个应用程序中访问THIS_IS_AN_ARRAY了。

4
您可以创建一个简单的类来保存这些信息。例如,您可以将以下内容添加到config/initializers/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获取数组值。该类不应在每个请求上重置。


实际上它是一个模型,不一定要是一个数组,我正在从couchdb预加载文档,以便进行全文搜索。 - Salvador Aceves
没问题。您可以随意修改类。您不必使用数组。此解决方案允许您保留一个变量,该变量最初从数据库预加载,并在整个应用程序生命周期中添加到它。您应该根据自己的用例进行修改。 - Pan Thomakos

1

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接