counter_cache是在做關聯性資料庫時計算資料量的一個方法
照樣舉Board
has_manyTopics
的例子來看
正常我們會寫類似下方的code來算出這個Board內有多少個Topics
@board.topics.count
這代表每次我們要算數量的時候都得下一個sql指令去算有多少topics,一樣是會造成效能問題。
所以rails內建了counter_cache的方法,我們只要在topic model內加上counter_cache: true
class Topic < ActiveRecord::Base
belongs_to :board, counter_cache: true
end
然後在board的資料庫內新增一個叫做topics_count
的欄位
這樣以後當這個Board內的topic有增減的時候,rails就會幫我們增減topics_count
的欄位,如此一來下次再下@board.topics.count
的指令時rails就會預設去找topics_count
的欄位,不用重新下sql指令計算。
我們也可以覆蓋rails的預設規定,自己定義要增減的欄位名稱,例如把topics_count
改成count_of_topics
:
class Topic < ActiveRecord::Base
belongs_to :board, counter_cache: :count_of_topics
end