Как работает Model.where ('false')? Я не уверен, что на самом деле делает вышеуказанный запрос - PullRequest
1 голос
/ 04 августа 2020

Я вижу, что запрос выполняется примерно так:

select * from <table_name> where (false);

Но мой вопрос:

Где (false), что ложно? Это говорит о том, что вся запись ложна, потому что здесь нет никакого смысла в каком-либо столбце таблицы? Если да, то что означает запись, ложь или истина?

Учитывает ли приведенный выше запрос какой-либо столбец для получения данных из таблицы, связанной с моделью?

Ответы [ 2 ]

0 голосов
/ 15 августа 2020

В базе данных SQL (реляционной) условия в предложении where известны как «предикаты».

Это логические операторы, которые оцениваются для соответствующих таблиц и значений столбцов.

Таким образом, строка будет возвращена, если предикат value > 100 истинен, например, или утверждение value in (select number from other_table) истинно.

Нередко можно увидеть запросы, содержащие такие предикаты, как * Включены 1010 * или 1 = 1, которые в основном совпадают с тем, что вы видите, - это предикты false или true.

Подобный предикат является константой независимо от значений строки Конечно, и умный оптимизатор запросов заметит, что и для false будет сокращать оптимизацию, чтобы не возвращать строки.

Этот синтаксис, вероятно, не будет работать во всех СУБД, но ActiveRecord может генерировать разные код для другой базы данных.

0 голосов
/ 04 августа 2020

Я беру Model как User

User.where(false) будет генерировать запрос как select users.* from users Таким образом, это возвращает все записи ИЛИ LIMIT 11, которые ограничены записями согласно пределу по умолчанию.

Как уже упоминалось в вопросе, 'false' - это строка. User.where('false') будет генерировать запрос как select users.* from users where (false) Таким образом, это не вернет никаких записей, поскольку критерии не выполнены.

Просто дополнительная информация о том, что произойдет, если мы используем true вместо false User.where(true) приведет к ошибке с ArgumentError (Unsupported argument type: true (TrueClass))

с использованием 'true' в качестве строки. User.where('true') будет генерировать запрос как select users.* from users where (true) Таким образом, это возвращает все записи ИЛИ LIMIT 11, что ограничено записями в соответствии с лимитом по умолчанию. Он работает так же, как User.where(false)

Примечание: результаты выше для консоли Rails 5.2.3

...