2013-07-12 5 views
6

Ich versuche, eine Liste von ganzen Zahlen hier zu speichern, ist das, was ich tue:Kann ich Scala List mit Slick (Play) verwenden?

MODEL

case class Score(
    scoresPerTime: List[Int] 
) 

object Scores extends Table[Score]("SCORES"){ 
    def scorePerTime = column[List[Int]]("SCORE_PER_TIME") 
    //...more code 
} 

-Controller

val form = Form(
    Map(
    "scoresPerTime" -> list(number) 
)(Score.apply)(Score.unapply) 
) 

ich eine Kompilation Fehler :

.... could not find implicit value for parameter tm: scala.slick.lifted.TypeMapper[List[Int]][error] def scorePerTime = column[List[Int]]("SCORE_PER_TIME") 

Wie kann ich das beheben, um eine Liste einzugeben? oder vielleicht versuchen Sie eine andere Option wie ein Tupel, enum ...

+0

Zuallererst: Was Sie wollen, ist wahrscheinlich ohne ein Problem möglich. Nur um sicher zu sein: Ich nehme an, dass Sie diese "Liste [Int]" in eine einzelne Tabellenspalte, sagen wir, als eine durch Kommas getrennte Zeichenfolge oder ähnliches speichern möchten. Ist das korrekt? Oder möchtest du, dass Slick eine neue Tabelle mit all den "Listen" -Elementen erzeugt, die dort für dich referenziert werden? – Carsten

+0

@Carsten Ich dachte an jeden Int in der Liste würde in einer eigenen Zeile eingefügt werden. – John

Antwort

6

Sie können dies tun, indem Sie einen Typ Mapper von sagen wir sagen, List [Int] zu String und umgekehrt.

Eine Möglichkeit:

implicit def date2dateTime = MappedTypeMapper.base[List[Int], String](
    list => list mkString ",", 
    str => (str split "," map Integer.parseInt).toList 
) 

ich sagen, es ist eine Möglichkeit, weil ich nicht getestet haben. Nicht sicher, dass die Tatsache, dass es eine Liste zurückgibt, Slick stört. Ein Ort, an dem es mehrdeutig sein kann, sind Sammelanfragen, bei denen Sie die Zahl , zählen und nicht eine count(field) (die natürlich eins sein soll).

Aber das ist völlig non-Relation. Der relationale Weg wäre, eine neue Tabelle mit zwei Feldern zu haben, wobei ein Fremdschlüssel eine Zeile bei Tabelle SCORES und ein anderes Feld mit einer SCORE_PER_TIME betrifft. Der Fremdschlüssel sollte ein nicht eindeutiger Index sein, damit Suchen schnell sind. Und glatt geht das ganz gut.