Модели добавляет и (1=0) к концу запросы
Я играл в консоли rails, пытаясь заставить вещи работать, и я постоянно замечаю, что один из моих запросов продолжает возвращать nil, когда это не должно быть. при взгляде на сгенерированный SQL-запрос я замечаю, что он имеет AND (1=0)
добавляется к нему каждый раз. Это немного раздражает, и я не знаю, почему он это делает.
Примечание: Использование actable gem.
Шаги для воспроизведения:
(После подключения к таблицам в консоли rails)
2.1.2 :xxxx > @parent = Parent.take
Parent Load (38.1ms) SELECT `parents`.* FROM `parents` LIMIT 1
=> #<Parent id: 37, ...>
2.1.2 :xxxx > @child = Child.where(id: @parent.actable_id)
SQL (0.7ms) SELECT `childs`.`id` AS t0_r0, `childs`.`attribute` AS t0_r1, FROM `childs`
...
LEFT OUTER JOIN `parents` ON `parents`.`actable_id` = `childs`.`id` AND `parents`.`actable_type` = 'child type' WHERE `childs`.`id` = 20 AND (1=0)
=> #<ActiveRecord::Relation []>
Почему это происходит? Как мне остановить это?
1 ответ:
Rails генерирует SQL, подобный
AND (1=0)
, Когда вы запрашиваете столбец, значение которого находится в пустом массиве:Child.where(id: [])
Интуитивно можно было бы ожидать, что для генерации SQL, как
SELECT * FROM children WHERE id IN ()
, но()
на самом деле не является допустимым SQL. Поскольку ни одна строка не будет соответствовать этому запросу, Rails работает вокруг этого, генерируя эквивалентный запрос, который также не возвращает строк:SELECT * FROM children WHERE 1=0;