2016-07-09 19 views
1

Ich möchte eine bestimmte Spalte in der Zeile nur aktualisieren, wenn die Zeile gültige Daten enthält. Spezifisch sein: Ich habe eine Tabelle mit Event, die start, stop und isActive Flag speichert. Ich möchte einige Events aktivieren durch Einstellung isActive bis true, aber ich muss überprüfen, ob Start-und Stoppdaten gültig sind. Modell:Eine Zeile nur aktualisieren, wenn die Bedingung erfüllt ist

case class Event {start:DateTime, stop:DateTime, isActive:Boolean} 

meine Validierungsmethode Signatur:

validateEvent(ev: Event): Boolean 

Mein erster Ansatz:

def activateEv() = Action.async(parse.json) { request => { ... val ev = db.run(dao.findEvById(poid, uid)) val ret = ev.flatMap { case st: Option[Event] => if (validateEvent(st.get)) { db.run(dao.updateActivity(poid, true).map { case 0 => false case other => true } } else Future(false) } ... } }

Ich glaube, dass es nicht der richtige Weg ist, wie dieses Problem angegangen werden soll. Könnten Sie uns beraten? Vielleicht wird nur ein db.run ausreichen?

Antwort

2

Dies kann in einem einzigen db.run unter Verwendung von Kombinatoren (z. B. flatMap) an DBIOAction Objekten erreicht werden. Unter der Annahme, dass aussehen Ihre dao Methoden wie folgt aus:

case object dao { 
    def findEvById(poid: Int, uid: Int): DBIOAction[Option[Event], NoStream, Effect.Read] = ??? 

    // In your case `updateActivity` returns an `Int` and you're mapping it to a `Boolean`. 
    // That mapping could be placed here, so `updateActivity` would return `Boolean` now. 
    def updateActivity(poid: Int, bool: Boolean): DBIOAction[Boolean, NoStream, Effect.Write] = ??? 
} 

Dies ist, wie wir die Sache erreichen Sie suchen:

... 
val action = dao.findEvById(poid, uid).flatMap { 
    case Some(event) if validateEvent(event) => dao.updateActivity(poid, true) 
    case _ => DBIO.successful(false) 
}.transactionally 

db.run(action) 
... 

Wie Sie wir eine Transaktion sehen haben hier, was eine machen würde Auswahl gefolgt von einer Aktualisierung (nur wenn die event gültig ist). Darüber hinaus könnte diese ganze select then update Aktion eine separate Methode in Ihrem dao sein.