Rails 3.0 の レコード取得返り値

株式会社ウサギィwiki:ruby/rails/RailsGuidesをゆっくり和訳してみたよ/Active Record Query Interfaceによれば、Rails 3.0から導入されたレコード取得メソッド where, select, group, order, limit, offset, joins, includes, lock, readonly, from の返り値はActiveRecord::Relation のインスタンス

Ruby on Rails APIによれば、レコードが取得できなかったときは、ActiveRecord::Relation.empty? は trueを返すとのこと。

一方で、今後、廃止が予定されているfind系の返り値はバラバラ。

  • Model.find(id) => ActiveRecord::RecordNotFound(例外)
  • Model.find(:first), Model.first() => nil
  • Model.find(:all), Model.all() => [](Array)
  • Model.find_all() => NoMethodError
  • Model.find_first() => NoMethodError
  • Model.find_by_id() => nil
  • Model.find_by_name() => nil
  • Model.find(:conditions=>["name=?",name]) => ActiveRecord::RecordNotFound(例外)
  • Model.find_by_sql(QUERY) => [](Array)

なので、早く Rails 3.0からの記法に統一した方がよさそう。そうすると返り値の判定は以下のものに統一できる。

@people = Person.where([****])
if @people.empty?
  レコードが取得できなかったときの処理
end