count、size、lengthの違い

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カウンタキャッシュなど
countSELECT countSELECT count毎回カウント、条件設定可
lengthコレクションの個数SELECT *
(ロードする)
ロードして何かしたい場合