如何使用Slick生成的表<>正确地申请,tupled等?

时间:2016-12-24 12:04:59

标签: scala slick

我有一个来自Slick(3.1.1)的代码生成模型,我知道我可以用它做下面的事情,例如。

val action = sql"""SELECT * FROM ${User.baseTableRow.tableName}""".as[UserRow].headOption
db.run(action)

但现在更多地涉及Slick我有以下查询:

val selectAction = (for {
  linkedAccount <- LinkedAccount
  user <- User if user.id === sourceUser.id && user.id === linkedAccount.userId
} yield (targetUser.id, linkedAccount.providerKey, linkedAccount.providerPassword, linkedAccount.modified)).
  result.map(_.map(LinkedAccountRow.tupled))

我可以将结果元组(targetUser.id, linkedAccount.providerKey, linkedAccount.providerPassword, linkedAccount.modified)映射到相应的案例类LinkedAccountRow的唯一方法是使用这个丑陋的.map(_.map(LinkedAccountRow.tupled)) ...并且应该有更优雅的方式来执行此操作使用生成的<>tupled或?

1 个答案:

答案 0 :(得分:1)

我个人在.map(_.map(LinkedAccountRow.tupled))中看不到任何丑陋的东西,但这仍然不是我用浮油做的首选方式。

编写Scala代码的一个非常重要的事情是,您的目标不是编写简洁的简洁代码,而是编写可读,更简单和易于理解的代码。

我会这样做,如下面的代码更多,但相对更清晰,

val selectionAction = LinkedAccount
  .join(User)
  .on({ case (linkedAccount, user) =>
    user.id === sourceUser.id && user.id === linkedAccount.userId
  })
  .map({ case (linkedAccount, user) =>
    (targetUser.id, linkedAccount.providerKey, linkedAccount.providerPassword, linkedAccount.modified)
  })

val resultFuture = db.run(selectionAction)

val linkedAccountRowListFuture = resultFuture.map(seq => {
  seq.map(tuple => LinkedAccountRow.tupled(tuple)).toList
})