ruby-on-rails - 如何清除 Ruby 中的内存缓存?

标签 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并在下一个请求生命周期内刷新?

最佳答案

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

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

关于ruby-on-rails - 如何清除 Ruby 中的内存缓存?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28260438/

相关文章:

mysql - 如何在 ruby​​ on rails 中使用 mysql 创建自动关联

ruby-on-rails - 使用 LDAP 进行 Rails 身份验证

ruby-on-rails - 为什么参数包含有关 Controller 和操作的详细信息?

ruby-on-rails - Ruby on Rails 4 - 重复的回形针验证消息

ruby-on-rails - Rails 服务器启动时如何自动启动浏览器?

ruby - Rails 4. 将表单信息从一个 Controller (无模型)移动到另一个(无模型)以便将参数传递给方法

ruby-on-rails - 在 rails 中具有关联的 fixture

ruby-on-rails - 在AWS EC2上安装Ruby 2.0和Rails 4.0.0beta

ruby-on-rails - Ruby 上周日的年月日

ruby-on-rails - 应用程序启动时运行的方法应该放在哪里?