Wie kann ich Felder für Fallklassen in einer übersichtlichen Tabellenzuordnung auslassen?
Ich bringe mir selbst ein bisschen Scala bei und werde gerade mit Slick (3.1) + Play Framework nass. Vielleicht ist die Antwort hier einfach und mir fehlt etwas Offensichtliches. Ich habe das folgende Modell und Tabelle
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)
}
Nun funktioniert das oben gut so wie es ist, aber ich möchte ein paar Felder zum @ hinzufügUser
case class that sind nicht in der USER-Tabelle gespeichert, dh Berechtigungen und Rollen, wie folgt:
case class User(id: Long = -1,
username: String,
passwordHash: String,
email: Option[String] = None,
permissions: Seq[String] = Seq.empty,
roles: Seq[String] = Seq.empty)
Diese sollen als Benutzer-ID -> Berechtigungs- / Rollenzuordnungen (einfache Beziehung zwischen eins und vielen) in ihre eigenen Tabellen gehen.
Letztendlich sollten auch diese abgefragt werden, aber im Moment möchte ich nur die zusätzlichen Felder ignorieren (nur als Übung). Wie passe ich die ursprüngliche Projektion in der Tabelle an, um diese neuen Felder auszulassen / zu ignorieren? Offensichtlich die ursprüngliche Zuordnung
def * = (id, username, passwordHash, email) <>((User.apply _).tupled, User.unapply)
funktioniert nicht mehr, da das touple nicht mit der case-Klasse übereinstimmt. Soweit ich das beurteilen kann, sollte es nicht zu schwer sein, da<>
benötigt nur zwei Funktionen, die von einem Tupel in eine Benutzerinstanz konvertiert werden und umgekehrt. Diese Funktionen sollten die neuen Felder einfach ignorieren (oder sie mit ihren Standardwerten füllen). Aber ich kann nicht herausfinden, wie ich das ausdrücken soll.
Ich habe versucht, ein neues @ hinzuzufügeapply()
mit einer kürzeren Signatur zumUser
Begleiter Objekt, aber dann bekomme ich einen Fehler, der mir im Grunde sagt, dass Slick nicht weiß, welcheapply()
benutzen. Sinnvoll, aber ich weiß nicht, wie ich mich auf das eine oder andere beziehen soll. Ich habe dasselbe mit einem zusätzlichen Konstruktor für @ gemacUser
, das Ergebnis ist das gleiche Problem. Und ich habe versucht, grundlegende Konvertierungsfunktionen wie diese zu schreiben:
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)
}
Leider führt das auch zu einem Fehler:
[error] found : (Long, String, String, Option[String]) => models.User
[error] required: ? => ?
[error] def * = (id, username, passwordHash, email) <>(constructUser, deconstructUser)