2016-07-09 68 views
1

我想只在行有有效数据的情况下更新行中的某一列。具体来说:我有一个Event表,其中start,stopisActive旗号。 我想通过设置isActivetrue激活一些Events,但是我需要检查开始和结束日期是否有效。 型号:只有条件满足时才更新行

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有效时)。此外,整个select then update行动可能是您的dao中的一个单独的方法。

相关问题