Почему 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?
в этот момент, но, возможно, кто-то еще.
Это интересно. Я смотрел на комментарий Филипа, чтобы понять, почему он сделал это, так как это выглядит как разъяснение, но он прав, что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
с обрабатываются по-разному.