Por que o Rails está adicionando `OR 1 = 0` às consultas usando a sintaxe hash da cláusula where com um intervalo?
O projeto em que estou trabalhando está usando o MySQL no RDS (mysql2 gem especificamente).
Quando uso um hash de condições, incluindo um intervalo em umwhere
Estou recebendo uma adição estranha à minha consulta.
User.where(id: [1..5])
e
User.where(id: [1...5])
Resultar nas seguintes consultas, respectivamente:
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))
As consultas funcionam perfeitamente bem, poisOR FALSE
é efetivamente um no-op. Só estou me perguntando por que o Rails ou o ARel estão adicionando esse trecho à consulta.
Parece que a linha quepoderia explique isso élinha 26 emActiveRecord::PredicateBuilder
. Ainda não faço ideia de como o hash poderia serempty?
nesse ponto, mas talvez alguém o faça.
Isso é interessante. Eu estava olhando para o comentário de Filip para ver por que ele fez isso, pois parece apenas um esclarecimento, mas ele está certo de que1..5 != [1..5]
. O primeiro é um intervalo inclusivo de 1 a 5, enquanto o segundo é uma matriz cujo primeiro elementoé o antigo. Eu tentei colocá-los em um ARelwhere
ligue para ver o SQL produzido e oOR 1=0
não está lá!
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)
Enquanto eu ainda não seiporque O ARel está adicionando oOR 1=0
o que sempre será falso e aparentemente desnecessário. Pode ser devido a comoArray
areiaRange
s são tratados de maneira diferente.