如何在类方法中使用低级 Rails 缓存?

How to use low-level Rails caching in a class method?

提问人:croceldon 提问时间:11/14/2023 更新时间:11/15/2023 访问量:87

问:

有人可以向我解释为什么这种缓存尝试不起作用吗?

# in an ActiveRecord model....
def self.label(da_code)
  Rails.cache.fetch [:option, :label, da_code, I18n.locale], expires_in: 3.hours do
    option = Option.i18n.find_by(code: da_code)
    return option.title if option

    da_code
  end
end

我在这里使用移动性进行翻译。在我看来,一旦加载,这根本不应该击中数据库。但它总是命中数据库,就好像缓存根本没有被使用一样。我已经在开发模式下启用了缓存,并且我已经验证了它在我的应用程序的其他地方是否有效。

我在这里错过了什么?

Ruby-on-Rails(红宝石轨道)

评论

0赞 Alex 11/14/2023
你能验证它吗,然后在控制台中做:第二次不应该是“CACHE miss”def self.label(code); Rails.cache.fetch([:option, code]) { puts "CACHE miss" }; endModel.label(:whatever) #=> CACHE missModel.label(:wathever)
0赞 croceldon 11/14/2023
@Alex - 每次运行该方法时,它都会显示“缓存未命中”。这不是缓存。
0赞 Alex 11/14/2023
“我在开发模式下启用了缓存” - 你确定吗?这在控制台中显示什么?Rails.application.config.cache_store
2赞 dbugger 11/14/2023
我认为返回可能会干扰缓存的设置 - 替换为return option.title if optionoption&.title
1赞 Alex 11/15/2023
从字面上替换为:stackoverflow.com/a/2518171/207090returnnextnext option.title if option

答:

1赞 dbugger 11/15/2023 #1

返回值干扰了缓存的设置。

尝试。。。

    def self.label(da_code)
      title = nil
      Rails.cache.fetch [:option, :label, da_code, I18n.locale], expires_in: 3.hours do
        option = Option.i18n.find_by(code: da_code)
        title = option&.title
      end
      title.present? ? title : da_code
    end