Как использовать ноль минимум в активном диапазоне записи - PullRequest
0 голосов
/ 20 марта 2020

В Rails 6.0.2.2 я получаю некоторые противоречивые поведения с диапазонами:

[49] pry(main)> Client.where(id: 1..3).limit(10).ids
   (8.0ms)  SELECT "clients"."id" FROM "clients" WHERE "clients"."id" BETWEEN $1 AND $2 LIMIT $3  [["id", 1], ["id", 3], ["LIMIT", 10]]
=> [1, 2, 3]
[50] pry(main)> Client.where(id: 1..).limit(10).ids
   (0.5ms)  SELECT "clients"."id" FROM "clients" WHERE "clients"."id" >= $1 LIMIT $2  [["id", 1], ["LIMIT", 10]]
=> [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
[51] pry(main)> Client.where(id: ..3).limit(10).ids
   (0.4ms)  SELECT "clients"."id" FROM "clients" WHERE "clients"."id" BETWEEN $1 AND $2 LIMIT $3  [["id", nil], ["id", 3], ["LIMIT", 10]]
=> []

Похоже, если вы используете максимальное значение nil в диапазоне, оно работает, как и ожидалось, с помощью >= в предложении where вместо between. Но если вы используете минимальное значение nil вместо <=, оно по-прежнему использует between, что не возвращает результатов. Это проблема в ActiveRecord, и есть ли рекомендуемый способ обойти это?

1 Ответ

1 голос
/ 20 марта 2020

Это похоже на проблему в ActiveRecord, и вы можете обойти ее, используя Arel или Float :: INFINITY.

Client.where(Client.arel_table[:id].gte(id))
Client.where(id: Float::INFINITY..3)

Проблема решена в Rails 6.1 и является должен быть перенесен на 6.0.

...