株式会社ウサギィ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