邁向 Rails 高級新手

counter_cache

counter_cache是在做關聯性資料庫時計算資料量的一個方法

照樣舉Boardhas_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