ソースコードを見ると明白なのでさらっとまじえつつ
sizeとcountの処理の違い
sizeは loaded?
でロード状態であればサイズそのものを使う。以下は執筆時点masterのコード
def size loaded? ? @records.length : count(:all) end
いっぽうcountは特に回避コードが書かれているわけで把握実行される。同じく以下が執筆時点のmasterのコード
def count(column_name = nil) if block_given? unless column_name.nil? raise ArgumentError, "Column name argument is not supported when a block is passed." end super() else calculate(:count, column_name) end end
大体一連の処理では同じ結果で一貫させたいはずなので、sizeのほうがよい場合がおおいので、ここを頭に入れながら使い分けをしたい。