Как я могу опустить поля класса случая в гладком отображении таблицы?
Я учу себя немного 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)