Edited at

find(42)とfind_by(id: 42)の違いについて

More than 3 years have passed since last update.


findとfind_by(id:)

大した内容ではないけど知識に穴があったので自分用にメモ。

両方ともRecordをidで検索して結果を返すが、見つからなかった時の挙動が違う。


find

User.find(1000)

User Load (0.6ms) SELECT `users`.* FROM `users` WHERE `users`.`id` = 1000 LIMIT 1
=> ActiveRecord::RecordNotFound: Couldn't find User with 'id'=1000

ActiveRecord::RecordNotFound が投げられる。


find_by(id:)

User.find_by(id: 1000)

User Load (0.5ms) SELECT `users`.* FROM `users` WHERE `users`.`id` = 1000 LIMIT 1
=> nil

nil が返る。

システムの挙動として、Recordが見つからないことが織り込み済みの場合は find_by を使って分岐か何かでnilを処理する。見つからないのが異常なら find を使ってエラーを投げて404ページを表示する。