2016-07-09 2 views
1

Я хочу обновить определенный столбец в строке только в том случае, если строка имеет действительные данные. Конкретно: у меня есть таблица с Event, в которой хранятся start, stop и isActive. Я бы хотел, чтобы некоторые Events активировали, установив isActive в true, однако мне нужно проверить, действительны ли даты начала и окончания. модель:Обновить строку только в том случае, если выполнено условие

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

мой валидация метода подписи:

validateEvent(ev: Event): Boolean 

Мой первый подход:

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) } ... } }

Я считаю, что это не так, как эта проблема должна быть решена. Не могли бы вы посоветовать? Может быть достаточно одного db.run?

ответ

2

Это может быть достигнуто в одном db.run с использованием комбинаторов (например, flatMap) на объектах DBIOAction. Если предположить, что ваши методы dao выглядеть:

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] = ??? 
} 

Это, как мы можем достичь, что вы ищете:

... 
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) 
... 

Как вы видите, у нас есть сделка здесь, что бы сделать после чего следует обновление (только если действителен event). Кроме того, все это может быть отдельным способом в вашем dao.

Смежные вопросы