日々徒然

プログラミングしたりお酒飲んだりする毎日

ActiveRecord::Relationに対してpresent?とexists?の違い

はじめに

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?を使った方が良さそう。

キャッシュについてはこの記事

blog.hirovodka.com