2013/04/17

Railsのモデルのcountとsizeの違い

<% tasks = Task.where(:done => false) %>
<% tasks.each do |t| %>

<%= t.name %>

<% end %>

合計: <%= tasks.size %>

2-4 行でタスクの名称を列挙しているので、該当するレコードデータはすべてアプリケーションに読み込まれています(この状態を「オブジェクトがロードされた」と表現します)。
このとき、tasks.size はデータベースに問い合わせる代わりに、オブジェクトの個数を数えて返します。しかし、ここで tasks.count と書いてしまうと、Rails は再度データベースに問い合わせます。微妙な話ですが、少しだけ無駄なのです(はじめる!Rails3(2)より)。