play framework application scala playframework slick slick-3.0

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?