railsにおいてmodelのデータを検索する際使用する 、findとfind_byの違いについて気をつけなければいけない点について書いていきます。
基本的な違い
findとfind_byの基本的な違いは主に
- find = モデルのIDを基準に検索をかける
- find_by = モデルのID以外の基準で検索をかけられる(IDでも検索可)
です。
例)
user = User.find(1)
user = User.find_by(name: 'hoge')
基本的にはIDで検索する場合は「find」をそれ以外の場合は「find_by」を使用しているかと思います。しかしIDで検索をかける場合でも 「find_by」を使用したほうが良い場面があります。
それは「find」と「find_by」で検索をかけて該当のデータがなかった場合の挙動に起因するのですが、
- findで検索をかけた時、該当のデータがなかった場合は例外が発生する
- find_byで検索をかけた時、該当のデータがなかった場合は「nil」が返る
という挙動の違いがあり、もし「find」を使用時に該当のデータがなかった場合エラーが出てしまいます。それを回避したい時はIDで検索をかける場面でも「find_by」を使用したほうがいいのです。
存在しないIDを「find」で検索する
User.find(1000)
# 結果
ActiveRecord::RecordNotFound (Couldn't find User with id'=1000)
存在しないIDを「find_by」で検索する
User.find_by(1000)
# 結果
User Load (0.2ms) SELECT "users".* FROM "users" WHERE "users"."id" = ? LIMIT ? [["id", 1000], ["LIMIT", 1]]
=> nil
既存のユーザーを編集するようなeditアクション等確実に存在するIDを検索するときは「find」を使用し、もしそうではなくエラーを出したくないような場面では「find_by」を使用するようにしましょう。