2016-07-08 17 views
-1

Ich habe einen Fall, Klasse basierend auf einigen DB-Operationen instanziiert wird:ein verschachtelten Objekte für Verständnis in Scala

case class FullFight(fight: FightsRow, firstBoxer: BoxersRow, 
    secondBoxer: BoxersRow, bookiesOdds: Seq[BookiesOddsRow]) 

val tupledJoin = for { 
    f <- Fights 
    b1 <- Boxers if f.firstBoxerId === b1.id 
    b2 <- Boxers if f.secondBoxerId === b2.id 
} yield (f, b1, b2) 

db.run(tupledJoin.result).map(_.map(FullFight.tupled)) 

Das Problem ist, dass ich keine bookiesOdds in dieser Abfrage angeben möchte (sie sind in einer anderen Abfrage ausgefüllt). Stattdessen möchte ich ein Tupel tupledJoin erstellen, das eine leere Sequenz von Seq [BookiesOddsRow] enthält, um das Objekt meiner Fallklasse zu erstellen. Gibt es eine Möglichkeit, das in einer For-Comprehension-Schleife zu mischen? Ich nehme an, ich brauche so etwas:

val seq: Seq[BookiesOddsRow] = Nil 

val tupledJoin = for { 
    f <- Fights 
    b1 <- Boxers if f.firstBoxerId === b1.id 
    b2 <- Boxers if f.secondBoxerId === b2.id 
} yield (f, b1, b2, seq) 

Ist das möglich? Wie man es richtig einführt?

Mit freundlichen Grüßen

+0

Ihr letzter Schnipsel scheint genau zu tun, was Sie Beschreiber. Was ist das Problem? – Dima

+0

Ich habe den Fehler 'nicht genug Argumente für Methodenmap: (implizite Form: slick.lifted.Shape [_ <: slick.lifted.FlatShapeLevel, (models.Tables.Fights, models.Tables.Boxers, models.Tables.Boxers , Seq [models.Tables.BookiesOddsRow]), T, G]) slick.lifted.Query [G, T, Seq]. Unspezifizierter Wert Parameter shape.' – Gandalf

+0

Ich sehe nichts mit Slick in Ihrem Schnipsel zu tun. Ihre Frage muss mit einigen Details von Slick zu tun haben, aber Sie haben nicht fast genug Details gepostet, um dieses Problem zu identifizieren. Ich kann Ihnen sagen, dass es absolut nichts falsch mit dem "for-Verständnis" -Snippet ist, das Sie gepostet haben. – Dima

Antwort

0

Ich glaube, du nur DB Aktionen in der für das Verständnis nutzen können. Sie könnten versuchen, diese (nicht getestet):

val tupledJoin = for { 
    f <- Fights 
    b1 <- Boxers if f.firstBoxerId === b1.id 
    b2 <- Boxers if f.secondBoxerId === b2.id 
    bookiesOdds <- DBIOAction.successful(Seq()) 
} yield (f, b1, b2, bookiesOdds) 
+0

Sie haben Recht! Ich musste meine Abfrage in Aktion konvertieren und dann alle Kartenänderungen damit vornehmen. – Gandalf