はじめに
Railsのfind
メソッドとfind_by
メソッドはレコードが見つからない時の挙動が異なります。
どっちがどっちだったかいつも忘れるため、備忘録としてまとめます。
レコードが見つからない場合におけるfindとfind_byの挙動の違い
レコードが見つからない場合の両者の挙動は次のとおりです。
-
find
メソッド:ActiveRecord::RecordNotFound
エラーを返す -
find_by
メソッド:nil
を返す
実際の挙動を確認
実際の挙動を確認して終わります。
find
メソッド(ActiveRecord::RecordNotFoundエラーが発生)
sample-app> Book.find(99999999)
Book Load (0.6ms) SELECT "books".* FROM "books" WHERE "books"."id" = ? LIMIT ? [["id", 99999999], ["LIMIT", 1]]
/opt/homebrew/lib/ruby/gems/3.3.0/gems/irb-1.14.0/lib/irb.rb:1285:in `full_message': Couldn't find Book with 'id'=99999999 (ActiveRecord::RecordNotFound)
find_by
メソッド(nil を返す)
sample-app> Book.find_by(id: 99999999)
Book Load (0.4ms) SELECT "books".* FROM "books" WHERE "books"."id" = ? LIMIT ? [["id", 99999999], ["LIMIT", 1]]
=> nil
おわりに
完全に記憶に定着するまで、何度でもアウトプットしていきます。