概要
ActiveRecordで条件に一致するデータが存在するかどうかを調べたいときは、exists?を使います。
User.where(name: "太郎").exists?
User Exists (0.2ms) SELECT 1 AS one FROM "users" WHERE "users"."name" = ? LIMIT ? [["name", "太郎"], ["LIMIT", 1]]
=> true
その逆で、条件に一致するデータが存在しないことを調べたい際は先頭にnot演算子を付けるケースをよく見かけます。
!User.where(name: "太郎").exists?
User Exists (0.2ms) SELECT 1 AS one FROM "users" WHERE "users"."name" = ? LIMIT ? [["name", "太郎"], ["LIMIT", 1]]
=> false
しかし、わざわざnot演算子を付けるのはなんかカッコ悪い感じがしますよね。
解決策
ActiveRecord::Relationには、レコードが0件の際にtrueを返すempty?というメソッドがあります。
実際にempty?を使って先ほどの実装を書き直してみました。
User.where(name: "太郎").empty?
User Exists (0.2ms) SELECT 1 AS one FROM "users" WHERE "users"."name" = ? LIMIT ? [["name", "太郎"], ["LIMIT", 1]]
=> false
これなら!exists?
のようにnot演算子を書かなくて良いので、スッキリして見えますね!