ActiveRecord::RecordNotFound.

>> User.find_by_login('foo')
=> nil
>> User.find(123)
ActiveRecord::RecordNotFound: Couldn't find User with ID=123
from /usr/local/ruby186/lib/ruby/gems/1.8/gems/activerecord-1.15.3/lib/active_record/base.rb:1031:in `find_one'
from /usr/local/ruby186/lib/ruby/gems/1.8/gems/activerecord-1.15.3/lib/active_record/base.rb:1014:in `find_from_ids'
from /usr/local/ruby186/lib/ruby/gems/1.8/gems/activerecord-1.15.3/lib/active_record/base.rb:419:in `find'
from (irb):7

レコードが見つからなかったときの挙動。
ActiveRecord::Base#find_by_*ではnilを返すのに、ActiveRecord::Base#findではActiveRecord::RecordNotFoundを投げてくるっていうのがどうも分からん。

Class: ActiveRecord::Base

RecordNotFound — no record responded to the find* method. Either the row with the given ID doesn’t exist or the row didn’t meet the additional restrictions.

ドキュメントはこう言ってるのに。
そもそも、レコードがなかったくらいでException投げてくるのって重い気がする。
ARだけになにか理由があるんだろうけど、それが知りたい。

コメント

  1. 芳賀 より:

    こんばんは。ワイズの芳賀です。

    「RailsによるアジャイルWebアプリケーション開発」
    225ページのコラム(David曰く raiseすべきか、しないべきか?)にこの挙動の違いについて解説されています。

  2. yoshuki より:

    確認しました、ありがとうございました。
    ページを開いたら「おーそうなのか」と思った記憶がよみがえってきた。orz

タイトルとURLをコピーしました