counter_cache

親子関係のテーブルをselectした時に
ぶら下がってる子テーブルの件数も表示させたいという場合
counter_cacheが使える。


通常、子のデータも欲しいときはincludeオプション(has_many または find時に随時指定)
とかで同時に読ませておいて
viewでParent.Children.size とかでやるのかと思っていたが
これだと、毎回select count(*)が走ってしまう。

使い方

参考URLまんまですが

  • モデル belongs_toに :counter_cache => true を設定
  • 親テーブルに chirdren_count を :default => 0 で追加
  • あとはviewで Parent.Children.size

注意点

途中でcouter_cacheを使う場合は、migrate時に値が0になっちゃうので
参考URLのようにupdate_countersを使うのが吉。


あと、「RailsによるアジャイルWebアプリケーション開発 」には
子を親に手動でリンクしてsaveする場合は、incrementされないって書いてるけど
まぁ、あんまりやらんと思われるので、あまり気にせず
使ってもいいかなと思った。