gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-03 15:59:39 28 4
gpt4 key购买 nike

我是 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  endend

现在的问题是,一旦 @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/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com