0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

「find」 と 「find_by」の使い分けで気をつけなければいけないこと

Last updated at Posted at 2022-02-12

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」を使用するようにしましょう。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?