はじめに
ActiveRecord::Relationオブジェクトの存在検証をする時にpresent?
とexists?
とする場合でパフォーマンスに違いがあるみたいなのでまとめてみました
present?
present?
の場合、SQLが発行されてオブジェクトがメモリに読み込まれます。
users = User.where(id: [1,2,3]) users.present? # SELECT 'users'.* FROM 'users' WHERE 'users'.'id' IN (1,2,3)
exists?
exists?
の場合、SQLは発行されますが条件が存在した場合にすぐにtrueが返されます
users = User.where(id: [1,2,3]) users.exists? # SELECT 'users'.* FROM 'users' WHERE 'users'.'id' IN (1,2,3) LIMIT 1
結局どっちを使うべきなのか
存在検証のみしたい場合はexists?
の方が良い
ただ、present?
の場合はキャッシュが残るため、一度読み込まれてるオブジェクトやその後も使用するオブジェクトの存在検証をする場合はpresent?
を使った方が良さそう。
キャッシュについてはこの記事