Как я могу опустить поля класса случая в гладком отображении таблицы?

Я учу себя немного Scala и в настоящее время промокаю ноги гладкой (3.1) + игровой платформой, так что, возможно, ответ здесь прост, и я упускаю что-то очевидное. У меня есть следующая модель и таблица

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)
  }

Теперь это выше работает просто отлично, но я хотел бы добавить некоторые поля вUser класс дела, которыйне сохраняются в таблице USER, а именно разрешения и роли, как это:

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

Предполагается, что они входят в свои собственные соответствующие таблицы в виде отображений идентификатора пользователя -> разрешения / роли (простые отношения один ко многим).

В конечном счете, их тоже следует запрашивать, но сейчас я просто хотел бы игнорировать дополнительные поля (чисто как упражнение). Как настроить исходную проекцию в таблице, чтобы пропустить / игнорировать эти новые поля? Очевидно, оригинальное отображение

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

больше не работает, поскольку тапл не соответствует классу case. Насколько я могу сказать, это не должно быть слишком сложно, так как<> просто берет две функции, которые преобразуют из топла в экземпляр пользователя и наоборот, и эти функции должны просто игнорировать новые поля (или заполнять их значениями по умолчанию). Но я не могу понять, как это выразить.

Я пытался добавить новыйapply() с более короткой подписью кUser объект-компаньон, но затем я получаю ошибку, которая в основном говорит мне, что пятно не знает, какойapply() использовать. Имеет смысл, но я не знаю, как ссылаться на то или другое. Я сделал то же самое с дополнительным конструктором дляUser, результат та же проблема. И я попытался написать основные функции преобразования, как это:

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)
  }

К сожалению, это также приводит к ошибке:

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

Ответы на вопрос(1)

Ваш ответ на вопрос