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点ドット(...)で範囲指定をするのが便利ですね。