RailsによるアジャイルWebアプリケーション開発
18章 Active Record その2:テーブル間のリレーションシップ
を読んでいて引っ掛かったのでメモ。
has_manyで追加されるメソッドで
子の関係にあるモデルの件数を返すメソッドが3つもある。
本では
■count
子の数を返す。
SQLの指定が可能、それ以外は標準的な Active Record のcountが使用される。
■size
すでにロードされている場合、そのコレクションのサイズが返される。
それ以外の場合は、データベースに照会することでカウントが返される。
■length
アソシエーションがリロードされるよう強制し、そのサイズを返す。
要は
基本、sizeで件数取得
条件入れたい場合は、count
毎回リロードさせたい場合は、length
ということか。
うっかり間違えそう。
補足
本をもう少し読み進めると、
Article(記事)と User(読者)を has_and_belongs_to_many を例にcountをする方法が載っていた。
これは使えそう。
# 記事123を各ユーザが読んだ回数は? counts = Article.find(123).users.count(:group => "users.name")
2010/02/11 追記
count、size、lengthの違い(再考) - うんたらかんたらRuby - Rubyist
要はこんなかんじ
方法 | ロード済の場合 | 未ロードの場合 | 備考 |
---|---|---|---|
size | コレクションの個数 | SELECT count | カウンタキャッシュなど |
count | SELECT count | SELECT count | 毎回カウント、条件設定可 |
length | コレクションの個数 | SELECT * (ロードする) | ロードして何かしたい場合 |