2017-06-07 7 views
0

と呼ばれていない私は、データベースにレコードを挿入したいがdb.runは私のコードは、この場合に問題になる可能性が何本滑らかなdb.runが

val insertQueryStep = processStepTemplates returning processStepTemplates.map(_.id) into ((processStep, id) => processStep.copy(id = Some(id))) 


    /** 
    * Generates a new ProcessStepTemplate 
    * 
    * @param step 
    * @return 
    */ 
    def addProcessStepTemplateToProcessTemplate(step: ProcessStepTemplatesModel, processId: Int): Future[Some[ProcessStepTemplatesModel]] = { 
    println("In DTO: " + step + ", processtemplate: " + processId) 

    //val p = processStepTemplates returning processStepTemplates.map(_.id) += step 
    val p = insertQueryStep += step 

    db.run(p).map(id => { 
     println("Die Query lautet: " + p) 
     println("Die erzeugte ID lautet: " + id) 

     //Update the foreign key 
     val q = for { p <- processStepTemplates if p.id == id } yield p.processtemplate 
     val updateAction = q.update(Some(processId)) 

     db.run(updateAction).map(id => { 
     println("Der neue Prozesschritt lautet: " + step) 
     Some(step) 
     }) 
     Some(step) 
    }) 
    } 

のように見えます

と呼ばれていません?

答えて

1

あなたはモナドとして(flatMapで)あなたの先物を構成する必要があります。内側の未来は完了しませんので。 (#2、コメント#1を参照)、次のようにコードを変更してください:

def addProcessStepTemplateToProcessTemplate(step: ProcessStepTemplatesModel, processId: Int): Future[Some[ProcessStepTemplatesModel]] = { 
    println("In DTO: " + step + ", processtemplate: " + processId) 

    //val p = processStepTemplates returning processStepTemplates.map(_.id) += step 
    val p = insertQueryStep += step 

    db.run(p).flatMap(id => {     // #1 change map to flatMap 
     println("Die Query lautet: " + p) 
     println("Die erzeugte ID lautet: " + id) 

     //Update the foreign key 
     val q = for { p <- processStepTemplates if p.id == id } yield p.processtemplate 
     val updateAction = q.update(Some(processId)) 

     val innerFuture = db.run(updateAction).map(id => { 
     println("Der neue Prozesschritt lautet: " + step) 
     Some(step) 
     }) 
     innerFuture        // # 2 return inner future 
    }) 
    } 

も(デシベルスキーマに接続し、クエリなど)別の問題を検出するためのロギングを使用しています。