2016-11-23 76 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