Как бы вы истекли время хранения фрагментов в модели или в Resque?
Я взял цитату ниже, в которой я вижу некоторый смысл:
"Кэшированные страницы и фрагменты обычно зависят от состояний модели. Кэш не заботится о том, какие действия создают, изменяют или разрушают соответствующие модели. Поэтому использование обычного наблюдателя представляется мне лучшим выбором для устаревших кэшей".
Например. У меня есть работник Resque, который обновляет модель. Мне нужен кэш фрагментов, чтобы истечь, когда модель обновляется / создается. Это не может быть сделано с подметальной машиной.
Однако использование наблюдателя будет означать, что мне нужно что-то вроде, либо в модели, либо в задании Resque:
ActionController::Base.new.expire_fragment('foobar')
Сама модель не должна знать о кешировании. Что также нарушит принципы MVC, которые приведут к безобразным уродливым результатам в будущем.
4 ответа
Используйте ActiveRecord::Observer для отслеживания изменений модели. Это может истечь кеш.
Вы можете автоматически завершить кэш, передав модель в качестве аргумента в шаблоне представления:
<% cache @model do %>
# your code here
<% end %>
За кулисами происходит кэш с именем [model]/[id]-[updated_at]. У моделей есть метод cache_key
, которая возвращает строку, содержащую идентификатор модели и отметку времени updated_at. При изменении модели отметка времени updated_at фрагмента не будет совпадать, и кэш будет сгенерирован заново.
Это гораздо более приятный подход, и вам не нужно беспокоиться о фоновых работниках или об истечении срока действия кэша в ваших контроллерах / наблюдателях.
У Райана Бейтса также есть платный Railscast на тему: Кэширование фрагментов.
Хорошим и простым решением было бы не истечь, а кэшировать его ключом, который будет отличаться, если содержимое отличается. Вот пример
<% cache "post-#{@post.id}", @post.updated_at.to_i do %>
Когда этот пост обновляется или удаляется, и вы извлекаете его снова, он пропустит кеш, поскольку хеш отличается, поэтому он как бы истекает и кеширует новое значение. Я думаю, что у вас могут возникнуть некоторые проблемы, например, если вы используете кеш Rails по умолчанию, который создает html-файлы в качестве кеша, так что через некоторое время в вашем публичном каталоге окажется много файлов, так что вам лучше установить ваше приложение использует что-то вроде memcached, который управляет памятью, удаляя старые кэшированные записи / страницы / parcials, если необходимо кэшировать другие или что-то в этом роде.
Я бы рекомендовал просмотреть этот раздел на sweepers
в Руководстве по Rails - Кэширование с Rails: обзор
http://guides.rubyonrails.org/caching_with_rails.html
Похоже, что это можно сделать без специального создания большого количества наблюдателей истечения срока действия кэша.