首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Rails和类变量:这种情况会在用户和服务器调用中持续存在吗?

Rails和类变量:这种情况会在用户和服务器调用中持续存在吗?
EN

Stack Overflow用户
提问于 2012-04-09 23:01:45
回答 5查看 6.8K关注 0票数 3

我们使用的是Rails 3.0.6。

以下代码会在Rails中的页面加载和用户之间持续存在吗?还是每次请求都会被重新定义?代码位于控制器的顶部。

代码语言:javascript
复制
@@list = []

hero = {}
hero['name'] = 'so'
hero['superpowers'] = ['coding', 'qa', 'spec_writing']
@@list.push hero

hero2 = {}
hero2['name'] = 'so2'
hero2['superpowers'] = ['coding']
@@list.push hero2
... more Hashes pushed into @@list

该列表每月只更改一次,我们希望能够高效、快速地将此数据提供给页面请求。我们最终将使用Rails.cache从数据库中读取数据,但现在我们使用以下方法(假设它可以工作)。

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2012-04-09 23:13:26

在开发中,默认行为是在每次请求时重新加载类,从而重置类变量。然而,在生产中,该类被初始化一次,因此类变量将在多个请求和多个会话中持久存在。

你应该尽快转向一种合适的缓存技术。显然,当应用程序重新启动时,您不能在重新加载类之后持久化该值。此外,如果web服务器是多线程的(很可能是这样),它可能会在不共享类变量的不同线程上运行应用程序的多个实例,这可能会在请求之间产生不一致。

票数 11
EN

Stack Overflow用户

发布于 2012-10-15 23:17:02

我刚刚遇到了同样的问题,并找到了这篇文章。我知道这是一个老问题,但发布我的答案是为了以防其他人遇到类似的问题……

我认为对于由于某种原因不能使用数据库Rails.cache的情况,最好的位置是应用程序类。只需定义一些属性并对其进行初始化。这样就可以像访问Rails.application.heros.一样轻松地访问它下面是一个简单明了的示例:

在config/application.rb中

代码语言:javascript
复制
module YourRailsApp
  class Application < Rails::Application
    attr_reader :heros

    initializer "init heros" do 
      @heros = []

      hero = {}
      hero['name'] = 'so'
      hero['superpowers'] = ['coding', 'qa', 'spec_writing']
      @heros.push hero

      hero2 = {}
      hero2['name'] = 'so2'
      hero2['superpowers'] = ['coding']

      @heros.push hero2
    end

    #Other application sutff...
  end
end
票数 1
EN

Stack Overflow用户

发布于 2012-04-09 23:13:38

我有时会使用我称之为的东西,即可怜的的缓存。

它的工作原理如下:

在初始化器中,添加:MY_CACHE_HASH = {}

  • wherever you

  • MY_CACHE_HASH[:foo] = :bar

  • wherever you need MY_CACHE_HASH[:foo] #=> :bar

我不推荐这样做:如果你的服务器崩溃了,你会怎么做?

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10075167

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档