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?

Rails モデルオブジェクトの戻り値

Posted at

最近学んだこと=>戻り値の種類(クラス)が異なる

データーベースからデータを取り出すとき、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はやはり難しくてでも面白いところだと感じました。

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?