>> 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を投げてくるっていうのがどうも分からん。
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だけになにか理由があるんだろうけど、それが知りたい。
コメント
こんばんは。ワイズの芳賀です。
「RailsによるアジャイルWebアプリケーション開発」
225ページのコラム(David曰く raiseすべきか、しないべきか?)にこの挙動の違いについて解説されています。
確認しました、ありがとうございました。
ページを開いたら「おーそうなのか」と思った記憶がよみがえってきた。orz