2013-07-12 19 views
6

Sto cercando di memorizzare un elenco di numeri interi qui è quello che sto facendo:Posso usare Elenco Scala con Slick (Riproduci)?

MODELLO

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

ricevo una compilation errore :

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

Come posso risolvere questo problema per inserire un elenco? o magari provare un'altra opzione come una tupla, enum ...

+0

Prima di tutto: quello che vuoi è probabilmente possibile senza problemi. Giusto per essere sicuro: presumo che tu voglia salvare questo 'List [Int]' su una singola colonna di una tabella, ad esempio, come una stringa separata da virgola o simile. È corretto? O vuoi che Slick generi una nuova tabella con tutti gli elementi di 'List' a cui fai riferimento per te? – Carsten

+0

@Carsten stavo pensando che ogni Int dell'elenco sarebbe stato inserito nella sua stessa riga. – John

risposta

6

Si può fare definendo un tipo di mappatore da diciamo Elenco [Int] a String e viceversa.

Una possibilità:

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

io dico che è una possibilità perche' non ho ancora testato. Non sono sicuro che il fatto che stia restituendo una lista interromperà Slick. Un posto dove può essere ambiguo sono le query aggregate, in cui si vorrebbe contare il numero di , e non fare uno count(field) (che sarà ovviamente uno).

Ma questo è completamente non-relazione. Il modo relazionale sarebbe quello di avere una nuova tabella con due campi, una chiave esterna che fa riferimento a una riga nella tabella SCORES e un altro campo con uno SCORE_PER_TIME. La chiave esterna dovrebbe essere un indice non univoco, quindi le ricerche sono veloci. E slick lo gestisce abbastanza bene.