我有一个关于同时使用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))
,但是还有什么更好的方法可以实现?
答案 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)