ScalingRails 11 Mar 2009 09:00 am
|
推到 Twitter!
推到 Plurk!
|
Scaling Rails - 第三章 Cache Expiration
這一集將討論的是 Expiration Strategy。
也許你還記得,上一集介紹了 update 的 action 裡,使用了 expire_page 去作 page 的 expiration。但如果只要會變動資料的 action 如: destroy 、create,都這樣暴力搞,頓時整支程式就會變得很髒。
有個方式可以簡化它:把 clear_posts_cache 寫成一個 method,再用 after_filter 呼叫它,這樣就會漂亮許多。
但問題又來了,也許不只 PostController 的這些 action 需要呼叫這個 method,其他 controller 如 Comment 也可能需要,那又要怎麼作呢?
有兩種作法:
1. 把 clear_posts_cache 放到 application.rb,讓所有 controller 都可以呼叫它。
2. 將 clear_posts_cache 變成一個 shared object :把 clear_posts_cache 丟進 post_cache_cleaner.rb 讓 comments_controller 和 post_controller 去 include。
但事實上我們可以不用這麼暴力,有一種更 convention 的方式已經內建在 Rails 裡了,稱之 Sweeper。Sweeper 不僅可以 Observes the Controller 更可以 Observes Models。
作法也很簡單:去 enviroment.rb 將此選項 uncomment
-
config.load_paths += %W(#{RAILS_ROOT}/extras
並修改成
-
config.load_paths += %W(#{RAILS_ROOT}/app/sweepers
在 app 下開一個新資料夾 sweepers,新建一個檔案叫 post_sweeper.rb。內容如下:
做好以後,也要在 controller 裡面設定哪些 action 才要呼叫 sweeper 。
sweeper 可以使用任何 ActiveRecord 的 callbacks 。
有些人其實不知道還可以用 controller callbacks,更還可以細到 action level。
下一集將介紹的是此系列 Video 的贊助商:New Relic 的 RPM。
This
work is licensed under a
Creative Commons Attribution-Share Alike 2.5 Taiwan License.
[本文採 cc-by-sa 授權,白話意思就是可以直接轉走,但是要附出處與作者)]
3 Responses to “Scaling Rails - 第三章 Cache Expiration”









on 11 Mar 2009 at 5:21 pm 1.Linuxice said …
請教一下!
在下一直想學《PHP》或《Rudy》,但是市面上都是《Rudy on Rails》的書,看起來好像沒有《Rails》,《Rudy》反而不是很好開發?
因為在下只是寫個《小程式》而已,所以《Rudy》好像滿大的?而且《PHP》好像不一定要《SQL》?
在下看了一下書後,發現《Rudy》好像是《Java+Html…》的前導工具,讓開發《AJAX》更方便的軟體,不知道這樣說有沒有錯?
當然《Rudy》比《PHP》的多樣性上強很多!
請指教~~~
on 13 Mar 2009 at 5:34 pm 2.xdite said …
是 Ruby 不是 Rudy。
在下會建議您重新 google 有關於 Ruby 的用途
on 13 Mar 2009 at 8:54 pm 3.Linuxice said …
感謝您的回應~~~