最近学んだこと=>戻り値の種類(クラス)が異なる
データーベースからデータを取り出すとき、find_byメソッドとwhereメソッドでは返すオブジェクトの数や種類が異なる。
find_byメソッド
User.find_by(id: 1)などの構文で返すオブジェクトは単一オブジェクト(一件のレコード)またはnilを返します。
User.find_by(id: 1)
=> #<User:0x0000000120479610
id: 1,
name: "foo bar",
email: "[FILTERED]",
created_at: "2025-04-17 00:31:48.479165000 +0900",
updated_at: "2025-04-21 15:08:39.117244000 +0900",
password_digest: "[FILTERED]",
remember_digest: nil>
whereメソッド
User.where(id: 1)とした場合、条件に一致するオブジェクトを返します。([]配列のようになっているのも特徴)
User.where(id: 1)
=>
[#<User:0x0000000120472f90
id: 1,
name: "foo bar",
email: "[FILTERED]",
created_at: "2025-04-17 00:31:48.479165000 +0900",
updated_at: "2025-04-21 15:08:39.117244000 +0900",
password_digest: "[FILTERED]",
remember_digest: nil>]
返すオブジェクトも見ためにはほぼ一緒ですが、違いがありそれは、find_byメソッドはそのモデルオブジェクト(ここではUserモデルのオブジェクト)を返すのに対し、whereメソッドはActiveRecord::Relationというオブジェクトを返している点です。
また複数の結果がある場合には配列になって返されるので、最初の一件だけを取得する場合にはfirstメソッドを繋いであげると、取得した1件のオブジェクトをform_withなどで使えるようになります。
初学者からしてみると、find_byやwhereメソッドどちらとも裏でSQL分が発行され、似たような結果を返しますが、返るオブジェクトに違いがある・それによって後で使用するメソッドも正しく書かないと例外が発生してしまう。Railsはやはり難しくてでも面白いところだと感じました。