Rails - истекающие кэшированные действия из Resque (альтернатива отложенного задания) - PullRequest
1 голос
/ 16 марта 2012

У меня есть очередь Resque, которая обрабатывает определенную модель, чтобы выполнить некоторую постобработку.После обновления этой модели я хотел бы прекратить действие кэшированного представления.

У меня установлена ​​и работает Sweeper, но он наблюдает только за изменениями, внесенными в модели в действиях контроллера.

Я знаю, что не очень MVC истекает кэшированные элементы из моей модели, но вся моя логика постобработки содержится в моих моделях.

В идеале я не хотел бы удваивать своикэш-очиститель кода, поэтому, если бы я мог заставить свой существующий уборщик наблюдать за изменениями модели, которые были бы идеальными.

В качестве альтернативы я бы согласился на использование кэша действий изнутри моей модели ИЛИ наблюдателя модели.* ps: я могу удалить из памяти кэшированные фрагменты из установленного мной наблюдателя модели, но не из действий.

Мне бы очень хотелось узнать, что здесь лучше всего делать.Я уверен, что я не единственный, у кого есть это требование.

Спасибо.

Мне интересно, может ли что-то подобное сделать:

http://dev.mensfeld.pl/2011/07/rails-wykorzystywanie-sweeperow-poza-kontrolerami-na-samych-modelach/

Ответы [ 2 ]

1 голос
/ 20 марта 2012

Поскольку я не смог добавить свой комментарий на сайт, на который вы ссылались.Я помещу это здесь:

В Rails 3.1.3, если вы создадите экземпляр контроллера, а затем попытаетесь вызвать expire_fragment, вы получите ошибки при попытке вызвать хост на NilClass.

ПослеПосле некоторых экспериментов я вспомнил, что функциональные тесты могут создавать экземпляры вашего контроллера.Поэтому я изменил код экземпляра на:

@controller ||= ApplicationController.new

if @controller.request.nil?
      @controller.request = ActionDispatch::TestRequest.new
end

Кажется, это работает, даже в производстве, даже с использованием консоли rails.

0 голосов
/ 21 марта 2012

В итоге я нашел следующее решение:

Добавил мой существующий Sweeper в список наблюдателей объектов в application.rb:

config.active_record.observers = :app_sweeper

Добавил код в методы Sweeperдля создания экземпляра объекта @controller, если он отсутствовал в очистителе (что происходит при передаче через объект вместо контроллера).

@controller ||= ActionController::Base.new

Затем я мог бы использовать метод expire_fragment для истечения срока действия в кэшесо следующим лакомым кусочком.

expire_fragment("#{ActionMailer::Base.default_url_options[:host]}/items/#{item.id}")

Тем не менее, ответ mj1531 может оказаться более удачным решением, если это означает, что я могу использовать метод expire_action вместо фальсификации его фрагментом expire.Я сообщу, когда я проверю это и выберу лучший ответ.

...