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.

whereとfind_byの違いについて

Posted at

はじめに

whereとfind_byの違いについてメモを残します

今回の背景

User.find(id)

違いを一言で

where・・・条件に該当する全てのレコードをActiveRecord::Relation オブジェクトとして返す
find_by・・・最初に該当する 1 件のレコードを返す

実際に書いてみる

該当するレコードが存在する場合
user.rb
class User < ActiveRecord::Base
end

where(id: 1) を使った場合は、id が 1 である全ての User レコードを取得する

users = User.where(id: 1)
#=> #<ActiveRecord::Relation [#<User id: 1, ...>, #<User id: 1, ...>]>

find_by(id: 1) を使った場合は、id が 1 である最初の User レコードを取得する

user = User.find_by(id: 1)
#=> #<User id: 1, ...>
該当するレコードが存在しない場合

where メソッドを使用して、存在しない id を指定すると、空のActiveRecord::Relation オブジェクトが返される

これは、where メソッドが条件に該当するレコードがなくてもエラーを発生させずに処理を継続するための仕様

users = User.where(id: 999)
#=> #<ActiveRecord::Relation []>

該当するレコードが存在しない場合には nil が返される
find_by メソッドが単一のレコードを取得することを期待するため、該当するレコードがない場合には nil を返す仕様

user = User.find_by(id: 999)
#=> nil
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?