«前の日記(2007年02月05日) 最新 次の日記(2007年02月08日)» 編集

ema log


2007年02月07日 [長年日記]

_ [Rails] counter cache

人気の本を実装するために,検索条件を考えるのが一番楽そうだったので,counter cache を使うことにした.

:counter_cache - (中略)You can also specify a custom counter cache column by given that name instead of a true/false value to this option (e.g., :counter_cache => :my_custom_counter.)

[Rails API ドキュメント ActiveRecord::Associations::ClassMethods-belongs_toより引用]

ということなので,名前を変えてみた.

まず,カラムを作らないと話にならないので,migration を書く.既存データの整合性をあわせるコードも入れておく.ここで,users は UserBook というモデルへの has_many :users, :through => :user_books であり,普通に,counter cache を使おうとすると,user_books_count というカラム名になるが,users_count の方が直感的で嬉しい.

そこで,のように,belong_to に,:counter_cache => :users_count を付け,直接カラム名を指定することで解決.名前重要.

これで,BooksController#popular の実装は楽勝.便利ですなぁ.

そうそう,find だと :order_by じゃなくて,:order が正解みたいです.paginate との整合性がとれてない.そのうち統一されるんでしょう.

_ [booshe] 人気のある本(所有者数の多い本)ページを実装

booshe: 本棚共有システム

ChangeLog

まだ,登録数が少ないので,一人しか登録してないのも出ちゃいますね.

_ [最近] 沿線火災で環状線停止

夕方帰っている途中,ちょうど火災が起きたとかで,環状線が止まった.

そのおかげで,整骨院に行きそびれたorz

本日のツッコミ(全7件) [ツッコミを入れる]
_ Hiroshi (2007年02月08日 02:06)

意味ぷー

_ ema (2007年02月08日 12:21)

自分用のメモだもん

_ ema (2007年02月08日 12:33)

書きかけで投稿しちゃった.もうちょっと,概要を詳しく書くと<br><br>1. 今使ってるテーブルだと,Book と User は UserBook というジョインモデル(Railsレシピ 22)で関連を記録してます<br>2. ある本を所有しているユーザ数を求めるためには,UserBook.find_by_book_id( book.id ) みたいな検索が必要 → SQL で書くにはややこしいというか,そこまで SQL わかってない<br>3. belongs_to, has_many のときに,counter_cache という仕組みが用意されている<br>4. ↑を使えば,キャッシュ結果で並べ替えれば簡単に find できる<br><br>対して説明がかわらんなぁ・・・belongs_to, has_many と counter_cache について調べてみればわかるはず・・・

_ Hiroshi (2007年02月09日 03:20)

2までは分かってました.counter cacheが何者か意味ぷーです.<br>SQLのCOUNTを毎回やると無駄だから専用のカラムを作ってるのかな?

_ ema (2007年02月09日 23:24)

たぶん,そういうこと.今回の場合は,さらに検索も楽にできるようになってウマーでした.<br><br>育て方にはでてこないの?>counter cache

_ Hiroshi (2007年02月10日 01:49)

counter cacheは育てる本には出てこなかったと思います。

_ TrackBack (2007年10月16日 09:59)

http://bizzyblogz.com/tramadolonline11<br>Tramadol.<br>Tramadol.<br>Tramadol hcl. Tramadol.