scala - framework - play application
Slick 3.0: forma idiomática de OBTENER resultados de la base de datos dentro de Option(Scala Play Framework) (1)
Simplemente llame a headOption
en su resultado en lugar de a la head
:
def findById(id: Int): Future[Option[Thing]] = db.run(filterQuery(id).result.headOption)
Tengo este código para una API
que me permite recuperar y objetar desde la base de datos y devolver un objeto JSON
usando Slick 3.0
:
// Model
case class Thing(id: Option[Int], name: String)
object Thing {
implicit val teamWrites = Json.writes[Thing]
}
class Things(tag: Tag) extends Table[Thing](tag, "thing") {
def id = column[Int]("id", O.PrimaryKey, O.AutoInc)
def name = column[String]("name")
def * = (id.?, name) <> ((Thing.apply _).tupled, Thing.unapply)
}
object Things {
private val db = Database.forConfig("h2mem1")
private object things extends TableQuery[Things](tag ⇒ new Things(tag)) {
def all = things.result
}
private def filterQuery(id: Int): Query[Things, Thing, Seq] =
things.filter(_.id === id)
def findById(id: Int): Future[Thing] = db.run(filterQuery(id).result.head)
}
// Controller
class ThingController extends Controller {
def get(id: Int) = Action.async {
Things.findById(id).map(thing => Ok(Json.obj("result" -> thing)))
}
}
El problema es que si consulto un objeto que no está en la base de datos, recibo una excepción. Lo que me gustaría hacer es obtener una Option
dentro del Future
que se devuelve del Model
para poder escribir algo como esto:
// Controller
class ThingController extends Controller {
def get(id: Int) = Action.async {
Things.findById(id).map {
case None => NotFound(Json.obj("error" -> "Not Found")))
case Some(thing) => Ok(Json.obj("result" -> thing)))
}
}
}
¿Tiene sentido?