【问题标题】:How to clear memory cache in Ruby?如何清除 Ruby 中的内存缓存?
【发布时间】:2015-03-31 09:04:02
【问题描述】:

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

模块站点助手 上课地点 def self.get(参数) @params = {} 除非 @params.kind_of?(Hash) 如果@params[param].nil? new_param = Site.find(参数) @params[参数] = new_param 结尾 @参数[参数] 结尾 结尾 结尾

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

【问题讨论】:

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


    【解决方案1】:

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

    您需要将#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")
    

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

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

    【讨论】:

      猜你喜欢
      • 2011-05-10
      • 1970-01-01
      • 1970-01-01
      • 2022-12-20
      • 1970-01-01
      • 2010-09-12
      • 2021-05-30
      • 2012-10-07
      • 2016-02-20
      相关资源
      最近更新 更多