ruby-on-rails - 在rails中一起使用'where'和'or'
问题描述
我有一个关于使用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))
但是有没有更好的方法来实现?
解决方案
“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
”方法听起来你已经在使用,但我们没有实际重复它们,而是使用一个变量。
推荐阅读
- javascript - 无法在 Spring MVC 4.3.9 中更改表单标记(方法获取)中的操作(参数)属性
- c# - NLog 似乎忽略了 .NET Core 3.1 Windows 服务中的配置文件位置
- python - Python 使用列表搜索列表,所有和任何
- sql - 从表中删除一个项目(行),但保留未使用的 ID 号以供将来插入
- java - OAuth 1.0“无法对您进行身份验证。”
- linux - 如何使用 linux 将列名更改为小写并按原样存储文件?
- python - 围绕预测线图绘制置信区间
- aws-lambda - HIVE_CANNOT_OPEN_SPLIT:打开 Hive 拆分 s3://***/date=2020-05-28/hour=20/part-00000-.c000.snappy.parquet 时出错(偏移量=0,长度=22009):
- android - 无法在 RecyclerView 内垂直对齐 2 个 Cardview
- javascript - 如何使用javascript fetch检查请求标头是否存在