[Rails] ActiveRecordの範囲指定に2点ドット(..)と3点ドット(...)を適切に使う


2点ドットの場合

Post.where(id: 1..3)
=> "SELECT "posts".* FROM "posts" WHERE "posts"."id" BETWEEN 1 AND 3"

between句になります。これは1と3の両端を含みます。

3点ドットの場合

Post.where(id: 1...3)
=> "SELECT "posts".* FROM "posts" WHERE "posts"."id" >= 1 AND "posts"."id" < 3)

1を含み3を含まないSQLが生成されます。あら便利。

どう使う?

問題になるのはcreated_atなどの連続値における範囲指定で、2点ドットの両端を含むデータ取得だと思わぬところでダブルカウントしてしまう可能性があります。
離散値を使う時には2点ドット(..)、連続値を使う時には3点ドット(...)で範囲指定をするのが便利ですね。