Почему Rails добавляет `OR 1 = 0` к запросам, используя синтаксис хэша условия where с диапазоном?

Проект, над которым я работаю, использует MySQL на RDS (в частности, mysql2 gem).

Когда я использую хэш условий, включая диапазон вwhere Заявление Я получаю немного странное дополнение к моему запросу.

User.where(id: [1..5])

а также

User.where(id: [1...5])

Результат в следующих запросах соответственно:

SELECT `users`.* FROM `users` WHERE ((`users`.`id` BETWEEN 1 AND 5 OR 1=0))
SELECT `users`.* FROM `users` WHERE ((`users`.`id` >= 1 AND `users`.`id` < 5 OR 1=0))

Запросы работают отлично, так какOR FALSE это фактически неоперация. Мне просто интересно, почему Rails или ARel добавляют этот фрагмент в запрос.

РЕДАКТИРОВАТЬ

Похоже, что линиямог объясни этострока 26 вActiveRecord::PredicateBuilder, До сих пор не знаю, как хэш может бытьempty? в этот момент, но, возможно, кто-то еще.

РЕДАКТИРОВАТЬ 2

Это интересно. Я смотрел на комментарий Филипа, чтобы понять, почему он сделал это, так как это выглядит как разъяснение, но он прав, что1..5 != [1..5], Первый является включающим диапазоном от 1 до 5, где вторым является массив, первый элемент которогоявляется бывший. Я пытался положить их в ARelwhere позвоните, чтобы увидеть, SQL производится иOR 1=0 не там!

User.where(id: 1..5) #=> SELECT "users".* FROM "users"  WHERE ("users"."id" BETWEEN 1 AND 5)
User.where(id: 1...5) #=> SELECT "users".* FROM "users"  WHERE ("users"."id" >= 1 AND "users"."id" < 5)

Пока я еще не знаюЗачем ARel добавляетOR 1=0 который всегда будет ложным и, казалось бы, ненужным. Это может быть связано с тем, какArrayс иRangeс обрабатываются по-разному.

Ответы на вопрос(5)

Ваш ответ на вопрос