¿Cómo puedo omitir los campos de clase de caso en una asignación de tabla pulida?

Me estoy enseñando algo de Scala y actualmente me estoy mojando los pies con slick (3.1) + play framework, así que tal vez la respuesta sea simple aquí y me falta algo obvio. Tengo el siguiente modelo y tabla

case class User(id: Long = -1,
                username: String,
                passwordHash: String,
                email: Option[String] = None) 

class Users(tag: Tag) extends Table[User](tag, "USERS") {
    def id = column[Long]("ID", O.PrimaryKey, O.AutoInc)
    def username = column[String]("USERNAME")
    def email = column[Option[String]]("EMAIL")
    def passwordHash = column[String]("PASSWD_HASH")
    def * = (id, username, passwordHash, email) <>((User.apply _).tupled, User.unapply)
  }

Ahora, lo anterior funciona bien, pero me gustaría agregar algunos campos aUser clase de caso queno son guardado en la tabla USER, a saber, permisos y roles, como este:

case class User(id: Long = -1,
                username: String,
                passwordHash: String,
                email: Option[String] = None,
                permissions: Seq[String] = Seq.empty,
                roles: Seq[String] = Seq.empty) 

Se supone que deben ir a sus propias tablas respectivas como userid -> permisos / asignaciones de roles (relaciones simples de una a muchas).

En última instancia, también deberían consultarse, pero por ahora me gustaría ignorar los campos adicionales (simplemente como un ejercicio). ¿Cómo ajusto la proyección original en la tabla para omitir / ignorar esos nuevos campos? Obviamente el mapeo original

 def * = (id, username, passwordHash, email) <>((User.apply _).tupled, User.unapply)

ya no funciona ya que el touple no coincide con la clase de caso. Por lo que puedo decir, no debería ser demasiado difícil ya que<> solo toma dos funciones que se convierten de un touple a una instancia de Usuario y viceversa, y esas funciones deberían ignorar los nuevos campos (o completarlos con sus valores predeterminados). Pero no puedo entender cómo expresar eso.

Traté de agregar un nuevoapply() con una firma más corta para elUser objeto complementario, pero luego aparece un error que básicamente me dice que slick no sabe quéapply() usar. Tiene sentido, pero no sé cómo hacer referencia a uno u otro. Hice lo mismo con un constructor adicional paraUser, el resultado es el mismo problema. E intenté escribir funciones de conversión básicas como esta:

class Users(tag: Tag) extends Table[User](tag, "USERS") {

    def constructUser = (id: Long, username: String, passwordHash: String, email: Option[String]) =>
      User(id, username, passwordHash, email)

    def extractUser = (user: User) => user match {
      case User(id, username, passwordHash, email, permissions, roles) =>
        Some((id, username, passwordHash, email))
    }

    def id = column[Long]("ID", O.PrimaryKey, O.AutoInc)
    def username = column[String]("USERNAME")
    def email = column[Option[String]]("EMAIL")
    def passwordHash = column[String]("PASSWD_HASH")
    def * = (id, username, passwordHash, email) <>(constructUser, extractUser)
  }

Lamentablemente, eso también conduce a un error:

[error]  found   : (Long, String, String, Option[String]) => models.User
[error]  required: ? => ?
[error]     def * = (id, username, passwordHash, email) <>(constructUser, deconstructUser)

Respuestas a la pregunta(1)

Su respuesta a la pregunta