2016-07-08 5 views
-1

У меня есть класс случая тот экземпляр на основе некоторых операций БД:Создание вложенных объектов из для-понимания в 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)) 

Проблема заключается в том, что я не хотел бы указать, какие bookiesOdds в этом запросе (они заполняются каким-то другим запросом). Вместо этого я хотел бы создать кортеж tupledJoin, содержащий пустую последовательность Seq [BookiesOddsRow], чтобы создать объект класса case. Есть ли способ смешать это в цикле для понимания? Я полагаю, мне нужно что-то вроде этого:

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) 

Возможно ли это? Как правильно его реализовать?

С наилучшими пожеланиями

+0

Ваш последний фрагмент, кажется, делает именно то, что вы описываете. В чем проблема? – Dima

+0

Я получил ошибку 'недостаточно аргументов для карты метода: (неявная форма: 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]. Unspecified value parameter shape. ' – Gandalf

+0

Я не вижу ничего общего с пятном в вашем фрагменте. Ваш вопрос должен иметь отношение к некоторым особенностям пятна, но вы не разместили достаточно подробностей для определения этой проблемы. Я могу сказать вам, что абсолютно ничего плохого в том, что вы опубликовали фрагмент 'for-comprehension'. – Dima

ответ

0

Я думаю, что вы можете использовать только действия DB в для понимания. Вы можете попробовать (не проверено):

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

Вы правы! Мне нужно было преобразовать свой запрос в действие, а затем внести с ним какие-либо изменения карты. – Gandalf

 Смежные вопросы

  • Нет связанных вопросов^_^