Рельсы - Объединение условий с ИЛИ - PullRequest
0 голосов
/ 27 января 2020

Я использую логику фильтра в ruby на рельсах, где пользователь может фильтровать записи в сочетании с оператором ИЛИ . Поэтому я проверил способ реализации ИЛИ в активной записи , и, поскольку мы находимся в рельсах 5, у нас есть или метод для объединения условий.

При использовании метода OR я получаю запрос, как показано ниже,

SELECT "users".*
FROM "users"
WHERE (
              (
                      (
                              "users"."first_name" ILIKE '%name1%' OR "users"."last_name" ILIKE '%name2%'
                          )
                      OR
                      "users"."email" ILIKE '%email%'
                  )
              OR (
                  "users"."email" ILIKE '%email%'
                  )
          );

Сборка запроса похожа на Model.where((((A OR B) OR C) OR D)). Мы используем Postgres в качестве базы данных.

У меня были сомнения: (((A OR B) OR C) OR D) и (A OR B OR C OR D) равны Postgres? и есть ли различия в производительности между этими двумя.

ПРИМЕЧАНИЕ. Я проверил запрос, построенный с помощью Расширенный поиск Ransack , запрос, построенный в формате (((A OR B) OR C) OR D).

1 Ответ

2 голосов
/ 27 января 2020

равно (((A OR B) OR C) OR D) и (A OR B OR C OR D) равно Postgres?

Не о Postgres, а о логических операторах в целом. Да, оба выражения эквивалентны (хотя первое является ненужным комплексом):

  • , если выполняется любое из 4 условий, оба логических выражения дают истинный результат
  • , если все 4 условия ложны, оба выражения дают ложный результат
...