はじめに
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