2016-07-09 9 views
1

行に有効なデータがある場合のみ、行の特定の列を更新したいと考えています。具体的にはEventのテーブルがあり、startstopisActiveフラグが格納されています。 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) } ... } }

私はそれがこの問題に対処する必要があるかの方法ではないと信じています。 アドバイスありますか? 1つのdb.runで十分でしょうか?

答えて

2

これは、DBIOActionオブジェクトのコンビネータ(例:flatMap)を使用して1つの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の別の方法である可能性があります。

関連する問題