#TODO
1 2 | |
使用 @board.posts.size 機制直接算出 boards 下有幾篇文章,產生的 SQL query 是使用 SELECT COUNT(*)
1
| |
若在 posts 數量相當大時,存取 boards#index 將會造成沈重的負擔。我們應該找個方法把這個數值 cache 起來。
Solution 1
- 應該在 board model 新增一個 integer 欄位紀錄有多少篇文章
- 每當文章被 新增 / 刪除之際,在 controller +1/-1 文章數量
Solution 2
這樣要寫太多行 code 了,事實上 Rails 內建了一個 counter_cache 的機制。當文章建立或刪除時,會自動進行 +1/-1 功能。
修改 app/models/post.rb
1 2 | |
1
| |
修改 db/migrate/20110529014114_add_posts_count_to_board.rb
1 2 3 4 5 6 7 8 9 | |
之後 @board.posts.size 就是直接去撈 posts_count 欄位的數字了。
注意事項
若 boards 內早已有文章,直接加上 counter_cache => true 會導致抓到的 size 是初始值 0。建議先開設 posts_count 欄位,手動跑個計算,先將正確統計數字加總後回存 posts_count,再宣告 counter_cache => true