【问题标题】:How to use the Slick generated Table <> apply, tupled, etc correctly?如何正确使用 Slick 生成的 Table <> apply、tupled 等?
【发布时间】:2017-05-09 20:19:37
【问题描述】:

我有一个来自 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)) ...并且应该有一个更优雅的方法来使用生成的&lt;&gt; ,tupled 还是?

【问题讨论】:

  • .map(_.map(LinkedAccountRow.tupled)) 有什么丑陋之处?

标签: scala slick


【解决方案1】:

我个人在 .map(_.map(LinkedAccountRow.tupled)) 中没有看到任何丑陋的东西,但这仍然不是我喜欢使用 slick 的方式。

关于编写 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
})

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-12-30
    • 1970-01-01
    • 2019-02-08
    • 1970-01-01
    • 2020-06-14
    • 1970-01-01
    • 2020-01-08
    相关资源
    最近更新 更多