🚨

【Rails】whereメソッドで範囲オブジェクト(Range)を使うときの注意点

2022/03/30に公開

Railsのwhereメソッドでは範囲オブジェクト(Range)を使う事ができます。

しかし、範囲オブジェクトを使ってxより大きいというSQLは発行できないので注意が必要です。

本題に入る前に、いくつかwhereメソッドで範囲オブジェクトを使う例を見てみます。

x以下

idが10以下のユーザーを取得したい時は次のように書きます。

User.where(id: ..10)

発行されるSQLは次のようになります。

SELECT "users".* FROM "users" WHERE "users"."id" <= $1  [["id", 10]]

x未満

idが10未満のユーザーを取得したい時は次のように書きます。

User.where(id: ...10)

発行されるSQLは次のようになります。

SELECT "users".* FROM "users" WHERE "users"."id" < $1  [["id", 10]]

x以上

idが10以上のユーザーを取得したい時は次のように書きます。

User.where(id: 10..)

発行されるSQLは次のようになります。

SELECT "users".* FROM "users" WHERE "users"."id" >= $1  [["id", 10]]

xより大きい(本題)

ここからが本題になります。

idが10より大きいユーザーを取得したい時、今までの流れだと次のように書きたくなると思います。

User.where(id: 10...)

しかし、発行されるSQLは次のようになっています。

SELECT "users".* FROM "users" WHERE "users"."id" >= $1  [["id", 10]]

idが10以上のユーザーを取得しています。

範囲オブジェクトを使って、望んでいた次のようなSQLは発行できないのです。

SELECT "users".* FROM "users" WHERE "users"."id" > $1  [["id", 10]]

もし上のように、10より大きいレコードを取得したい場合は次のように書く必要があります。

User.where('id > ?', 10)

まとめ

whereメソッドで範囲オブジェクトを使うときはぜひお気をつけくださいませ。

Twitter始めたので良かったらフォローしていただけると嬉しいです。

Discussion