2016-07-09 3 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

이는 DBIOAction 개체에서 결합 자 (예 : flatMap)를 사용하여 단일 db.run에서 수행 할 수 있습니다. 가정 당신의 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에서 별도의 방법이 될 수 있습니다.