コード日進月歩

しんくうの技術的な小話、メモ、つれづれ、など

ActiveRecordのレコード数を測るときはsizeでやると大体がよしなにやってくれる

ソースコードを見ると明白なのでさらっとまじえつつ

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のほうがよい場合がおおいので、ここを頭に入れながら使い分けをしたい。

参考リンク