2017-12-22 6 views
0

Ich habe Probleme herauszufinden, wie man eine Spalte mit Typ Enumeration mit Play-Slick aktualisieren.spielen Slick Aktualisierung Aufzählung Spalte

Hier ist meine Enum und Fallklasse:

object TestStatus extends Enumeration { 
    type TestStatus = Value 
    val Status1 = Value("Status1") 
} 
case class Test (
    id: String, 
    status: TestStatus 
) 

und die Tabellenzuordnung:

class Tests(tag: Tag) extends Table[Test](tag, "tests") { 
    implicit val statusColumn = MappedColumnType.base[TestStatus, String](_.toString, TestStatus.withName) 
    override def * = (id, status) <> ((Test.apply _).tupled, Test.unapply) 
    val id = column[String]("id", 0.PrimaryKey) 
    val status = column[TestStatus]("status") 
} 

, wenn ich versuche, eine Prüfung Zeile zu gehen und zu aktualisieren, ich einen Fehler:

object TestQueries extends TableQuery[Tests](new Tests(_)) { 
    def updateStatus(id: String, newStatus: TestStatus) = { 
    TestQueries.filter(_.id === id).map(_.status).update(newStatus) 
    } 
} 

[error] Slick does not know how to map the given types. 
[error] Possible causes: T in Table[T] does not match your * projection, 
[error] you use an unsupported type in a Query (e.g. scala List), 
[error] or you forgot to import a driver api into scope. 
[error] Required level: slick.lifted.FlatShapeLevel 
[error]  Source type: slick.lifted.Rep[models.TestStatus.Value] 
[error] Unpacked type: T 
[error]  Packed type: G 
[error]  TestQueries.filter(_.id === id).map(_.status).update(newStatus) 
[error]          ^

IntelliJ zeigt, dass TestQueries.filter(_.id === id).map(_.status) hat Query[Nothing, Nothing, Seq], die mich das Problem denken ich s mit der spezifischen Spalte statt mit der Update-Funktion.

Aktualisierung der ID funktioniert gut mit der gleichen Struktur.

+0

aussehen Es scheint, als nur 'Tests' Klasse implizite Spaltenzuordnung für' TestStatus' hat. Könnten Sie klären, ob 'TestQueries' auch eine korrekte Spaltenzuordnung im Umfang hat? Versuchen Sie den 'statusColumn'-Wert innerhalb von' TestQueries' zu kopieren und prüfen Sie, ob er kompiliert wird. – AdamBat

+0

@AdamBat Es ist ein bisschen unklar von meinem Code, aber ich habe versucht, die Spaltenzuordnung zu verschiedenen Bereichen zu kopieren: 'TestStatus' Objektebene sowie 'TestQueries' Ebene, alle mit den gleichen Ergebnissen. – itadoatL

+0

Könnten Sie Repository mit repliziertem Problem bereitstellen? Ich habe Ihren Code ad hoc kopiert und den gleichen Compilerfehler erhalten. Das Duplizieren der 'TestStatus'-Spaltenzuordnung in' TestQueries', wie ich es im obigen Kommentar vorgeschlagen habe, half dabei, das Problem zu lösen. Hier ist mein Kern, der zeigt, was ich genau gemacht habe: https://gist.github.com/Dasiu/ae4fa9bfa9077569e5e07a02aa1493f0 – AdamBat

Antwort

0

Sie müssen den benutzerdefinierten Spaltentyp TestStatus.Value definieren. Dies ist, wie glatt können Sie eine benutzerdefinierte Spalte Typ indem sie sie zu einem bereits unterstützten Typzuordnung bauen:

implicit def testStatCT: BaseTypedType[TestStatus.Value] = 
    MappedColumnType.base[TestStatus.Value, String](
    enum => enum.toString, str => TestStatus.withName(str) 
) 

dieser impliziten Bedürfnisse importiert werden, wo immer implizite Auflösungen wie das in Ihrem Beispiel nicht (oder noch besser definiert in der TestStatus Objekt, so dass es immer verfügbar ist) auf diese Weise glatt kann Beweis haben, dass TestStatus.Value ist eine BaseTypedType die im Grunde nur bedeutet, dass etwas ein unterstützter Spaltentyp ist.

Für weitere auf Spaltenzuordnung lesen Sie bei Slick Documentation