Scala Slick 3.1-将Slick表行对象转换为案例类

Scala Slick 3.1-将Slick表行对象转换为案例类,scala,slick,Scala,Slick,我已经使用Slick 3.1代码生成器创建了默认对象和trait Tables.scala 下面的方法可以工作,但是我想隐式或显式地将UserRow和PasswordsRow转换为User和UserPassword 工作方法: override def getUser(email: String): Future[Option[(Tables.UsersRow, Tables.PasswordsRow)]] = db.run { (for { user <- users if user

我已经使用Slick 3.1代码生成器创建了默认对象和trait Tables.scala

下面的方法可以工作,但是我想隐式或显式地将UserRow和PasswordsRow转换为User和UserPassword

工作方法:

override def getUser(email: String): Future[Option[(Tables.UsersRow, Tables.PasswordsRow)]] = db.run {
(for {
  user <- users if user.email === email
  password <- passwords if password.id === user.id
} yield (user, password)).result.headOption
override def getUser(电子邮件:String):Future[Option[(Tables.UsersRow,Tables.PasswordsRow)]=db.run{
(用于{

用户可能是这样的吗

val futureUserRowAndPwdRow = getUser(email)
val futureUser: Future[Option[(User, UserPassword)]] = futureUserRowAndPwdRow map {
  maybeUserRow => maybeUserRow map {
    case (userRow, pwdRow) => (User(userRow.whatever....), UserPassword(..))
  }
}

你能再解释一下吗?如果我理解正确的话,他有一个
Future[Option[(Tables.UsersRow,Tables.PasswordsRow)]
,他想要一个
Future[Option[(User,userpasswords)]]
。他只需要映射它,就可以得到他的案例类
User
UserPassword
,而不是行类……一点也不复杂。
  package model

import com.wordnik.swagger.annotations.{ ApiModel, ApiModelProperty }
import slick.jdbc.GetResult
import spray.json.DefaultJsonProtocol

import scala.annotation.meta.field

case class User(
  id: Int,
  email: String,
  name: Option[String] = None,
  surname: Option[String] = None,
  passwordId: Option[Int] = None
)

object User extends DefaultJsonProtocol{
  implicit val getUserResult = GetResult(r => User(r.<<, r.<<, r.<<, r.<<, r.<<))

  implicit val userFormat = jsonFormat5(User.apply)
}
package model

import com.github.t3hnar.bcrypt.{Password, generateSalt}
import slick.jdbc.GetResult


case class UserPassword(id: Int, hashedPassword: Option[String], salt: String = generateSalt) {
  def passwordMatches(password: String): Boolean = hashedPassword.contains(password.bcrypt(salt))
}

object UserPassword {

  implicit val getUserPasswordResult = GetResult(r => UserPassword(r.<<, r.<<, r.<<))

  def newWithPassword(password: String) = {
    val salt = generateSalt
    new UserPassword(0, Some(password.bcrypt(salt)), salt)
  }
}
val futureUserRowAndPwdRow = getUser(email)
val futureUser: Future[Option[(User, UserPassword)]] = futureUserRowAndPwdRow map {
  maybeUserRow => maybeUserRow map {
    case (userRow, pwdRow) => (User(userRow.whatever....), UserPassword(..))
  }
}