Как контролировать положение скобок в запросе ActiveRecord с помощью предложения OR - PullRequest
3 голосов
/ 19 июня 2020

Я хочу сгенерировать следующий SQL запрос с использованием ActiveRecord для Rails:

SELECT * FROM users WHERE (((1 IS NULL) OR (10 > 20)) AND (2 IS NULL OR (10 > 1)));

Итак, я написал следующую область:

where('1 IS NULL')
  .or(where('10 > 20'))
  .where('2 IS NULL')
  .or(where('10 > 1'))

Однако я получаю немного другое query:

SELECT * FROM users WHERE (((1 IS NULL) OR (10 > 20)) AND 2 IS NULL OR (10 > 1));

Обратите внимание, что у первого нет скобок, окружающих все после AND, в то время как у первого нет. Это влияет на результаты, которые я получаю (первый запрос оценивается как false, а второй - как true).

Как мне написать второй запрос с помощью ActiveRecord?

Этот вопрос кажется очень похожим: Как правильно добавлять скобки к SQL запросам с предложениями 'или' и 'и' с помощью Arel? Arel теперь является частью Rails, поэтому любой ответ должен быть актуальным.

Разница заключается в обоих такие же запросы, которые приводят к дискуссии о том, как сделать его более понятным, а во-вторых, это было для более старой версии Rails, поэтому ответы, похоже, не работают.

Я также не хочу, чтобы новый драгоценный камень для этого, я думаю, ActiveRecord должен справиться с этим.

Edit:

В итоге я написал это так:

where("(1 IS NULL OR 10 > 20) AND (2 IS NULL OR 10 > 1)")

но теперь я Я просто обхожу ActiveRecord, я надеялся сделать это с помощью ActiveRecord

1 Ответ

2 голосов
/ 20 июня 2020

Вы можете получить нечто подобное, только без основных скобок, заключающих условия предложения where:

User.where('foo IS NULL')
    .or(User.where('10 > 20'))
    .merge(User.where(bar: nil)
               .or(User.where('10 > 1')))
# SELECT "users".*
# FROM "users"
# WHERE ((foo IS NULL) OR (10 > 20)) AND ("users"."bar" IS NULL OR (10 > 1))

Считайте, что foo равно 1 и bar равно 2.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...