ActiveRecordのcountとlengthとsize

ActiveRecordのcountとlengthとsize

みなさんこんにちは。

意識高い系エンジニアの僕です。

今日も高まる意識をおさえつつRailsを書いていたんですが、気づいたらcountとlengthとsizeの意味がごっちゃになっていた(忘れていた)ので整理してみました。

ActiveRecordのcountとlengthとsizeの違い

ActiveRecordでレコード数をカウントするときに、count,length,sizeなどカウントするメソッドは複数存在しますが、状況に応じて適切に使い分ける必要があります。

ActiveRecordでのレコード数のカウント方法

メソッド 内容 キャッシュ
count SQLのCOUNTを使ってカウントします 使わない
length SQLの実行結果の行数をカウントします あれば使う
size SQLのCOUNTを使ってカウントします あれば使う

lengthの場合、SQLの実行結果の行数をカウントするため、COUNTを使ってカウントするcountsizeの方が処理は軽くなります。
しかし、countはキャッシュを使わないため、毎回COUNTのSQLを実行してしまいます。

行数のカウントだけであれば、キャッシュの有無で判断してくれるsizeを使ったほうが良さそうです。

ちなみに今のRailsはSQLを遅延実行するようになっているので、たとえば以下の様なSQLが2回発行されるようなコードでも、

pry(main)> clients = Client.all
  Client Load (0.3ms)  SELECT `clients`.* FROM `clients`
pry(main)> clients.count
   (0.3ms)  SELECT COUNT(*) FROM `clients`
=> 5

メソッドチェインでつなぐと、1回のSQL発行で済むようになっています。

pry(main)> Client.all.count
   (0.2ms)  SELECT COUNT(*) FROM `clients`
=> 5

TAG

  • このエントリーをはてなブックマークに追加
金子 将範
エンジニア 金子 将範 rubyist

新しいことや難しい課題に挑戦することにやりがいを感じ、安定やぬるい事は退屈だと感じます。 考えるより先に手が動く、肉体派エンジニアで座右の銘は諸行無常。 大事なのは感性、プログラミングにおいても感覚で理解し、感覚で書きます。