2016-11-23 106 views
2

的序列相結合的行動我有(工作)下面的代碼:油滑:與DBIOAction

val actions = (for { 
    _ <- slickUsers.insertOrUpdate(dbUser) 
    loginInfo <- loginInfoAction 
    _ <- slickUserLoginInfos += DBUserLoginInfo(dbUser.userID, loginInfo.id.get) 
} yield()).transactionally 

與loginInfoAction是一個DBIOAction。我想將loginInfoActions更改爲DBIOAction的Seq,併爲它們中的每一個執行相同的DBUserLoginInfo操作。

我想這愣神:

val actions = (for { 
    _ <- slickUsers.insertOrUpdate(dbUser) 
    loginInfoAction <- loginInfoActions 
    loginInfo <- loginInfoAction 
    _ <- slickUserLoginInfos += DBUserLoginInfo(dbUser.userID, loginInfo.id.get) 
} yield()).transactionally 

但它不按預期工作(我會雖然loginInfoAction會遍歷DBIOAction的序列)。我是Slick的新手,所以如果我錯過了任何事情,請不要猶豫,指向我的文檔!

+0

請檢查答案我已經發布了一個新的答案 – pamu

回答

7

DBIO.sequence

使用DBIO.sequenceList[DBIO[_]]轉換爲DBIO[List[_]]和使用,理解。

DBIO.sequence會將DBIO的順序轉換爲DBIO[Seq[_]]

例如,讓說我們有一個功能getUser

def getUser(userId: Long): DBIO[User] 

def getAllUsers(userIds: List[Long]): DB[List[User]] = { 
    DBIO.sequence(userIds.map(getUser)) 
} 

DBIO.Sequence轉換List[DBIO[_]]DBIO[List[_]]

現在你的代碼變得

val actions = (for { 
    _ <- slickUsers.insertOrUpdate(dbUser) 
    loginInfoActionList <- DBIO.sequence(loginInfoActions) 
    _ <- DBIO.sequence { loginInfoActionList.map { loginInfo => 
      slickUserLoginInfos += DBUserLoginInfo(dbUser.userID, loginInfo.id.get) } 
     } 
} yield()).transactionally 
+0

我正在將一個重要的項目遷移到光滑的地方,所以我不能100%確定,但它看到了至少編譯ms! – CanardMoussant

+0

我忘了回來說,但它工作正常。再次感謝! – CanardMoussant