我想通过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
的类型方法签名。
但是,我似乎找不到一种方法将传递为Rep[Boolean]
的{{1}}作为折叠初始值设定项。在黑暗中拍摄时,我尝试过true
和Rep(true)
,但都没有用。
我可以完全放弃LiftedLiteral[Boolean](true)
并选择:
fold
但这似乎太复杂了,b <- bars if {
val rep1 = b.id === id
fooIdOpt.map(fooId => rep1 && b.fooId === fooId).getOrElse(rep1)
}
看起来不会更好。
fooIdOpt match { case Some ...
的{{1}}文字?Rep[Boolean]
,true
或fold
之外,还有其他选择可以使我建立一个查询,该查询可以选择比较map
价值?答案 0 :(得分:2)
您已经知道,ifEmpty
的{{1}}值类型必须与fold
的{{1}}类型相匹配。一种方法是将b.fooId === _
应用于Rep[Boolean]
值,如下所示:
bind
答案 1 :(得分:1)
一种不像其他选择那么糟糕的替代选择:
(fooIdOpt.toList.map(b.fooId === _) :+ (b.id === id)).reduceLeft(_ && _)