我想查询一个对象
id
,但是如果
fooId
还提供了,然后我希望将其包含在查询中。
def getById(id: Long, fooIdOpt: Option[Long]): Future[Option[Bar]] = {
val query = for {
b <- bars if b.id === id && fooIdOpt.fold(true)(b.fooId === _)
} yield { // Compiler error here ^
b
}
db.run(query.result.headOption)
}
这里的问题是
fooIdOpt.fold(true)(b.fooId === _)
需要返回
Rep[Boolean]
但是我要用一个
Boolean
-明显违反
fold
的方法签名。
但是我似乎找不到通过
布尔[布尔]
评估结果为
true
作为折叠初始值设定项。在黑暗中射击,我试过了
Rep(true)
和
LiftedLiteral[Boolean](true)
但都不太管用。
我可以放弃
折叠
完全符合:
b <- bars if {
val rep1 = b.id === id
fooIdOpt.map(fooId => rep1 && b.fooId === fooId).getOrElse(rep1)
}
但这似乎太复杂了,
fooIdOpt match { case Some ...
看起来不会好很多。
-
有没有办法实例化一个
布尔[布尔]
始终计算为的文本
真
?
-
如果没有,除了我的尝试还有别的选择吗?
折叠
,
map
或
match
上面允许我构建一个查询,可以选择比较
卵形的
价值?