2015-06-09 2 views
1

я думаю, не работает, потому что я проверить его с реальной ситуацией дб, и всегда возвращает содержимое БДRails 4 кэширование низкого уровня не работает

  1. ыполните Rails.cache.fetch
  2. Изменить базу данных
  3. Выполните снова Rails.cache.fetch, и вот оно не должно вернуть новое значение, которое я изменил в db. но это происходит, не кэширование выполняется

    класса Translation < ActiveRecord :: Base

    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 
    

    конец

Тест:

Я Execute Translation.translate('Alojamiento','en') и возвращает то, что находит на DB: "Accomodation"

Затем я изменяю таблицу базы данных, заменяя «Размещение» на «Размещение ---», и фиксирует, ...

Вернитесь к Rails, выполните то же самое Translation.translate('Alojamiento','en') и оно вернет новое значение "Accomodation---" !!!

Но это не должно быть! не так ли? Потому что я положил expires_in: 1.month не в 1.second

Или, знает ли Rails, когда база данных изменена, и истекает срок действия кэша?

Я думаю, что кэш не работает, или, может быть, я пропускаю некоторые конфигурации

Спасибо большое


  • Один из способов сделать «это работает» (но я не» t like) перемещает код Rails.cache... в контроллере метода и вызывает URL-адрес, например 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 
    
+1

Вы видите это в своей среде разработки? Убедитесь, что 'config/environment/development.rb' не имеет' config.cache_store =: null_store', который отключил бы кеширование. – SteveTurczyn

+0

Нет, в производственной среде, на двух разных серверах (локальных, через рельсы s -e producion.И сервер производства Apache). –

+0

Я думаю, что у Rails.cache.fetch есть что-то, что делает его другим, если оно выполняется в модели или контроллере –

ответ

0

Решение в положить в результате кэш в переменной, и вернуть его

IT кажется это не то же самое, это:

def self.translate(es_text,locale=I18n.locale) 
    retorn_text=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? 
    end 
    return retorn_text 
end 

, чем это:

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 
    end 

end 

Но я не понимаю, почему

Смежные вопросы