Использование «где» и «или» вместе в рельсах - PullRequest
0 голосов
/ 20 сентября 2018

У меня проблема с использованием where и or вместе.

Item.where(a: true) 
.where("b>=?", 1) 
.or(Item.where(c: true)) 
.where(d: true)

То, чего я пытаюсь достичь, - это после того, как первое условие, a: true, найти, есть ли какие-либо элементы b >=?, 1.если найдены какие-либо предметы, переходите к четвертому условию where(d:true), но если ничего не найдено, переходите к третьему условию or(Item.where(c: true), а если какие-то предметы обнаруживаются из третьего условия, переходите к четвертому условию .where(d:true).

Это то, чего я пытаюсь достичь, но, похоже, когда items достиг третьего условия .or(Item.where(c: true)), оно не прошло предыдущие условия.

Я добавил предыдущие условия в третье условие, например or(Item.where(a:true).where("b>=?",1).where(c:true)), но есть ли лучший способ добиться этого?

Ответы [ 2 ]

0 голосов
/ 21 сентября 2018

Ваша логика сводится к следующему:

a IS TRUE 
AND (b >= 1 OR c IS TRUE)
AND d IS TRUE

Это может быть выражено как:

Item
  .where(a: true) 
  .merge(
    Item
      .where("b>=?", 1) 
      .or(Item.where(c: true)) 
  )
  .where(d: true)
0 голосов
/ 20 сентября 2018

«if» и «move to» - не очень понятные способы взглянуть на выражение SQL ... обычно лучше думать о нем как о том, что все оценивается одновременно, в отличие от императивного языка.

Тем не менее, я думаю, что это запрос, который вы хотите:

a_items = Item.where(a: true)
a_items.where("b >= ?", 1).
  or(a_items.where(c: true)).
  where(d: true)

Это в основном тот же подход «повторить условия внутри or», звучит так, как будто вы уже используете, но вместо того, чтобы фактически повторятьих мы используем переменную.

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