2012-03-16 26 views
1

我有Resque隊列,它處理特定的模型以執行一些後期處理。一旦這個模型更新,我想過期緩存的視圖操作。Rails - 從Resque過期的緩存操作(延遲作業替代方案)

我有一個Sweeper設置和工作,但它只能觀察對控制器操作中的模型所做的更改。

我知道從我的模型中過期緩存的項目不是很MVC,但我的模型中包含了所有的後期處理邏輯。

理想情況下,我希望不會在緩存清除代碼上加倍,所以如果我能讓我現有的清掃工看到理想的模型更改。

或者我會解決從我的模型或模型觀察者內部實現動作緩存。

p.s .:我可以從我設置的模型觀察者中過期緩存片段,但不能操作。

我真的很想知道這裏的最佳做法。我確信我不是唯一一個有這個要求的人。

謝謝。

我想知道如果這樣的事情是要走的路:

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

回答

1

由於我沒有能夠添加上你鏈接到該站點我的意見。我會把它放在這裏:

在Rails 3.1.3中,如果您實例化控制器然後嘗試調用expire_fragment,您會收到有關嘗試在NilClass上調用主機的錯誤。

經過一番嘗試,我記得功能測試可以實例化你的控制器。因此,我將實例代碼更改爲:

@controller ||= ApplicationController.new 

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

即使在生產中,即使使用rails控制檯,這似乎也能正常工作。

0

最後我想出了以下解決方案:

加我現有的掃地機對象觀察員名單在application.rb中:

config.active_record.observers = :app_sweeper 

添加了代碼的清掃方法來實例化@controller對象,如果它在清理程序中丟失(這是通過對象而不是控制器發生的情況)。

@controller ||= ActionController::Base.new 

然後,我可以使用expire_fragment方法使緩存的操​​作過期,並帶有以下小技巧。

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

這就是說,mj1531的回答可能被證明是一個更好的解決方案,如果這意味着我可以使用expire_action方法,而不是與到期片段作假的。我將在測試完成後報告並選擇最佳答案。