ActiveRecord の find(id) と find_by_id(id) の違い

2008-03-13
2011-01-08
かなり古い記事です。現在も有効な内容であるかどうか分かりませんのでご注意ください。

両方とも id を指定してレコードを探すことに違いはないが、レコードが見つからなかった場合の挙動に差がある。

レコードが見つからなかったとき
find(id) 例外が発生する
find_by_id(id) nil が返る

find(id) に find_by_id(id) の挙動を期待していたので以下のようなコードを書いてしまっていた。

@item = Item.find(params[:id]) if params[:id]
render(:nothing => true, :status => '404 Not Found') unless @item

これだとレコードが見つからなかったときにサーバーエラー(ステータスコード 500)になってしまう。
そうならないためには以下のコードが正しい。

@item = Item.find_by_id(params[:id]) if params[:id]
render(:nothing => true, :status => '404 Not Found') unless @item

奥が深い。

参考

ActiveRecord のお勉強 - Rails で行こう! - Ruby on Rails を学ぶ

Profile

フルスタック気味のフリーランスプログラマー。

どちらかと言うと得意はインフラ構築とサーバーサイドプログラミングですが、フロントエンドもぼちぼちやっています。

最近の興味範囲はWordPress、AWS、サーバーレス、UIデザイン。

愛車はセロー。カメラはペンタックス。旅好きです。横浜在住。