Rails 4低级缓存不起作用

问题描述 投票:1回答:1

我认为这是行不通的,因为我在真实的数据库情况下对其进行了测试,并且始终返回数据库的内容

  1. 执行Rails.cache.fetch
  2. 修改数据库
  3. 再次执行Rails.cache.fetch,在这里not应该返回我在db中修改的新值。但它发生了,没有执行缓存

    类翻译

    def self.translate(es_text,locale=I18n.locale)
    
      Rails.cache.fetch("#{es_text}/#{locale}", expires_in: 1.month) do
        trad=self.find_by_es_text(es_text)
        translated=eval("trad.#{locale}_text")
        return translated if translated.present?
      end
    
    end
    

    结束

测试:

我执行Translation.translate('Alojamiento','en')并返回在DB上找到的内容:"Accomodation"

然后我修改数据库表,将“ Accomodation”替换为“ Accomodation ---”,并提交,...

回到Rails,执行相同的Translation.translate('Alojamiento','en')并返回新值"Accomodation---" !!!

但是不应该!!是不是?因为我没有将expires_in: 1.month放在1.second

或者,Rails是否知道何时修改数据库并自动使缓存过期?

我认为缓存无法正常工作,或者可能缺少某些配置

非常感谢


  • 一种使“它起作用”的方法(但我不喜欢)是在方法控制器中移动Rails.cache...代码,并调用类似www.app/translate/Alojamiento?locale=en的网址。在这种情况下,它可以工作,但是在模型中进行缓存更为正确。

    class ApplicationController < ActionController::Base
      ...  
      def translate
        text_return=Rails.cache.fetch("#{params[:es_text]}/#{params[:locale]}", expires_in: 1.month) do
          Translation.translate(params[:es_text],params[:locale])
        end
        render text: text_to_return
      end
    
ruby-on-rails-4 caching
1个回答
1
投票

解决方案是将缓存结果放入变量中,然后将其返回

© www.soinside.com 2019 - 2024. All rights reserved.