Slick - 如果数据库不包含结果怎么办

Slick - What if database does not contain result

我正在尝试构建一个简单的 RESTful 服务,该服务对数据库和 returns JSON 执行 CRUD 操作。我有一项服务遵循这样的 API

GET mydomain.com/predictions/some%20string

我使用一个 DAO,其中包含我创建的以下方法来检索关联的预测:

def getPrediction(rawText: String): Prediction = {
  val predictionAction = predictions.filter{_.rawText === rawText}.result
  val header = predictionAction.head
  val f = db.run(header)
  f.onComplete{case pred => pred}
  throw new Exception("Oops")
}

然而,这不可能,所以我开始阅读有关 Option 的内容。我相应地更改了我的代码:

def getPrediction(rawText: String): Option[Prediction] = {
  val predictionAction = predictions.filter{_.rawText === rawText}.result
  val header = predictionAction.headOption
  val f = db.run(header)
  f.onSuccess{case pred => pred}
  None
}

感觉还是不太对。调用这些过滤器、return 结果和处理任何不确定性的最佳方法是什么?

我认为重写代码的最佳方式是这样的:

def getPrediction(rawText: String): Future[Option[Prediction]] = {
  db.run(users.filter(_.rawText === rawText).result.headOption)
}

换句话说,return 一个 Future 而不是普通结果。这样,数据库操作将异步执行,这是 Play 和 Akka 的首选方式。

客户端代码随后将与 Future 一起工作。例如,一个 Play 动作就像:

def prediction = Action.async {
  predictionDao.getPrediction("some string").map { pred =>
    Ok(views.html.predictions.show(pred))
  }.recover {
    case ex =>
      logger.error(ex)
      BadRequest()
  }
}