我有一些(meta)代码处理我想要更新的数据库对象T
。
只有已知的事物是此类对象的ID
,要检索它的query
以及要执行的update
。
def updateObject(...) : Either[(Int,String),(Int,T)] = {
T.update(
query,
update,
) match {
case 0 => Left(404, "No such object!")
case _ =>
T.findOne("id == objectId")
.map((200, _)) match {
case Some(result) => Right(result)
case _ => ???
}
}
}
T.update
对满足query
的对象执行更新,并返回写入结果,这是一个整数(受更新影响的记录数)。
返回类型为Either[(Int,String),(Int,T)]
:
如果受影响的记录数为0,则该对象不存在,因此我返回Left(404,"No such object")
。
如果对象已更新,我需要获取它(因为我只有其ID),将其映射到(Int,T)
,然后将其返回Right
。
以下是问题:
T.findOne
返回Option[T]
。
我已经对对象进行了更新,因此它存在且结果始终为Some(T)
。
我知道case _ => ???
将永远不会被调用,但如果我不把它放进去,编译器会警告我这场比赛并非详尽无遗。
有没有更好的方法来解决此问题(Option
总是保证Some
)?
(我试图避免Option.get
方法),而case _ => ???
似乎是不必要且令人困惑的代码。
答案 0 :(得分:1)
为什么不选择Option.get,如果你100%确定会有结果。 第二个Option.getOrElse还将介绍在您能够检索更新对象之前消失的极端边缘情况。
这样的事情怎么样:
T.findOne("id == objectId").map(Right(200,_._2)).getOrElse(Left(404,"Insane Corner Case : Updated Object not found"))
答案 1 :(得分:1)
我决定考虑"极端"情况下。
代码已经重构为:
T
.findOne("id == objectId")
.map((200, _))
.toRight(404, "Object has been deleted")
感谢 m-z 提示。