在rails中一起使用“ where”和“ or”

时间:2018-09-20 05:58:50

标签: ruby-on-rails

我有一个关于同时使用whereor的问题。

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 :(得分:0)

“ 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内的条件重复”方法,基本上相同,但是我们使用变量来代替实际重复它们。

答案 1 :(得分:0)

您的逻辑可以归结为:

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)