Rails - 来自Resque的缓存操作(延迟作业替代)

时间:2012-03-16 06:26:19

标签: ruby-on-rails ruby-on-rails-3 delayed-job resque

我有Resque队列来处理特定模型以进行一些后期处理。更新此模型后,我希望使缓存的视图操作失效。

我有一个Sweeper设置和工作,但它只观察对Controller Actions中的模型所做的更改。

我知道从我的模型中过期的缓存项目不是MVC,但我的模型中都包含了所有后期处理逻辑。

理想情况下,我不想加倍我的缓存清除代码,所以如果我可以让我现有的清扫工来观看理想的模型更改。

或者,我会满足于从我的模型或模型观察者中删除动作缓存。

p.s。:我可以在我设置的模型观察者中使缓存的片段失效,但不是操作。

我真的很想知道这里的最佳做法是什么。我相信我不是唯一有这个要求的人。

感谢。

我想知道这样的事情是否可行:

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

2 个答案:

答案 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片段伪装它。我会在测试时报告并选择最佳答案。