迷い人

日々勉強。勉強の先に何か見つかるといいなぁ

【回答】findとfind_byとwhereの違いについて

問題

findとfind_byとwhereの違いについて説明しなさい。

 

回答

返り値が異なる

  • findとfind_byはモデルのオブジェクトを返す
  • whereはActiveRecord::Relation(配列みたいなもの)を返す

 

検索結果が無かった時の挙動が異なる

  • findはActiveRecord::RecordNotFoundを返す(すなわち、エラーとなる)
  • find_byはnilを返す
  • whereはActiveRecord::Relation[](空の配列みたいなもの)

 

参考

例えば、Taskテーブルに1つだけ(id=1だけ)レコードが登録されている状態で、id=2のデータを取得しようとすると、findの場合、以下のエラーとなる。

 

f:id:oyaoya1123:20191204125455p:plain

 

whereの場合、空の配列のようなものを返すのでeachで値を取り出す処理であってもエラーとならずにすみます(結果が表示されないだけ)

 

ちなみにwhere(id: 2).firstのように最初の値を取ろうとするとnilとなります。

 

参考URL

Ruby on Rails - 0件のDBの検索における「ActiveRecord::RecordNotFound」について|teratail

ActiveRecord の find と where の違い。 - Qiita

Active Recordの色々なメソッドの返り値 - Qiita

find、find_by、whereの違い - Qiita

 

回答

【回答】findとfind_byとwhereの違いについて - 迷い人