我有Resque队列来处理特定模型以进行一些后期处理。更新此模型后,我希望使缓存的视图操作失效。
我有一个Sweeper设置和工作,但它只观察对Controller Actions中的模型所做的更改。
我知道从我的模型中过期的缓存项目不是MVC,但我的模型中都包含了所有后期处理逻辑。
理想情况下,我不想加倍我的缓存清除代码,所以如果我可以让我现有的清扫工来观看理想的模型更改。
或者,我会满足于从我的模型或模型观察者中删除动作缓存。
p.s。:我可以在我设置的模型观察者中使缓存的片段失效,但不是操作。
我真的很想知道这里的最佳做法是什么。我相信我不是唯一有这个要求的人。
感谢。
我想知道这样的事情是否可行:
http://dev.mensfeld.pl/2011/07/rails-wykorzystywanie-sweeperow-poza-kontrolerami-na-samych-modelach/
答案 0 :(得分:1)
由于我无法在您链接到的网站上添加我的评论。我会把它放在这里:
在Rails 3.1.3中,如果你实例化控制器然后尝试调用expire_fragment,那么你会在尝试在NilClass上调用host时遇到错误。
经过一些实验,我记得功能测试可以实例化你的控制器。所以我将实例化代码更改为:
@controller ||= ApplicationController.new
if @controller.request.nil?
@controller.request = ActionDispatch::TestRequest.new
end
即使在生产中,这似乎也可以使用,甚至使用rails控制台。
答案 1 :(得分:0)
最后我提出了以下解决方案:
将我现有的清扫器添加到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片段伪装它。我会在测试时报告并选择最佳答案。