如何在Ruby中清除内存缓存?

时间:2015-02-01 07:18:09

标签: ruby-on-rails ruby ruby-on-rails-4 rails-activerecord

我是Ruby的新手。我有一个rails应用程序,我在数据库中保留了站点配置(如站点名称)。我已经设置了一个帮手,所以我可以打电话给:site_param 'site_name'。帮助程序将数据存储在变量中,以便应用程序在每次调用时都不会访问数据库,具体如下:

module SiteHelper
  class Site
    def self.get(param)
      @params = {} unless @params.kind_of?(Hash)

      if @params[param].nil?
        new_param = Site.find(param)
        @params[param] = new_param
      end

      @params[param]
    end
  end
end

现在的问题是,@params存储了一个值后,它就不会刷新下一个请求。来自php背景,这种单例在每次请求时都会刷新,所以如果我在数据库上编辑一个值,它会被刷新而没有问题。在ruby中,@params被缓存并保持相同的值,直到我重新启动服务器。有没有办法让@params仅用于请求生命周期并在下一次刷新?

1 个答案:

答案 0 :(得分:2)

您的代码的问题在于您在类的上下文中使用实例变量,因此只要进程正在运行,它就会一直存在。

您需要将#get转换为实例方法,并重用Site类的实例。你在Ruby中写的内容肯定不是类似单例的实现。

module SiteHelper
  def site
    @site ||= Site.new
  end

  class Site
    def get(param)
      @params = {} unless @params.kind_of?(Hash)

      if @params[param].nil?
        new_param = Site.find(param)
        @params[param] = new_param
      end

      @params[param]
    end
  end
end

# In the view
site.get("whatever")

您的代码也可以改进为更红宝石风格。请注意#get的实现,利用||=和返回值。

module SiteHelper
  def site
    @site ||= Site.new
  end

  class Site
    def get(param)
      @params ||= {}
      @params[param] ||= Site.find(param)
    end
  end
end