Модели добавляет и (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 21

1 ответ:

Rails генерирует SQL, подобный AND (1=0), Когда вы запрашиваете столбец, значение которого находится в пустом массиве:

Child.where(id: [])

Интуитивно можно было бы ожидать, что для генерации SQL, как SELECT * FROM children WHERE id IN (), но () на самом деле не является допустимым SQL. Поскольку ни одна строка не будет соответствовать этому запросу, Rails работает вокруг этого, генерируя эквивалентный запрос, который также не возвращает строк:

SELECT * FROM children WHERE 1=0;