2015-03-12 2 views
0

У меня есть этот запрос, который должен получить список сообщений с информацией отправителя и их списком получателей (считает идентификатор_группы и SenderId параметров функции):Получение кортежа объектов и списка из Slick 2 запроса

(for { 
    groupUsers <- Users.users if targets.groupID === groupID 
    mRecipients <- recipients if mRecipients.targetID === groupUsers.id 
    message <- messages if message.senderID === groupUsers.id || message.id === mRecipients.messageID 
    sender <- Users.users if sender.id === m.senderID 
} yield (message, sender ,mRecipients)).list.map{ result => new FullMessage(result ._1, result ._2, result ._3) } 

Но в результате я получил кортеж (Message, пользователя, получателя), когда я хотел бы иметь кортеж (Message, пользователя, список [Получатель]). Как мне получить такой результат?

Спасибо всем.

+0

Что такое '' recipients' и messages'? ? Вам нужно больше узнать о них. Этот вопрос является неполным. –

ответ

1

Ну ... код будет выдавать результат в соответствии с тем, что вы написали, а не в соответствии с тем, что вы хотите. В центре внимания этой части ...

yield (message, sender ,mRecipients) 

Вы дающий кортеж (message, sender, mRecipents)

И вы сделали это внутри для понимания

mRecipients <- recipients if mRecipients.targetID === targetID 
message <- messages if message.senderID === senderID || message.id === mRecipients.messageID 
sender <- Users.users if sender.id === m.senderID 

Здесь каждый из выражений, как recipients if mRecipients.targetID === targetID оценивает к Query Монада.

Чтобы понять, что случилось с этим, он очень похож на следующий и позволяет думать, что происходит, когда мы делаем это,

scala>:pa 
// Entering paste mode (ctrl-D to finish 

for{ 
    i <- List(1, 2, 3) 
    j <- List(1, 2, 3) 
    k <- List(1, 2, 3) 
} yield(i, j, k) 

// Exiting paste mode, now interpreting. 

res1: List[(Int, Int, Int)] = List((1,1,1), (1,1,2), (1,1,3), (1,2,1), 
(1,2,2), (1,2,3), (1,3,1), (1,3,2), (1,3,3), (2,1,1), (2,1,2), (2,1,3), 
(2,2,1), (2,2,2), (2,2,3), (2,3,1), (2,3,2), (2,3,3), (3,1,1), (3,1,2), 
(3,1,3), (3,2,1), (3,2,2), (3,2,3), (3,3,1), (3,3,2), (3,3,3)) 

Проще говоря, for comprehensions сделать что-то похожее на развертке в monad и получить итератор из значений внутри него ... и затем снова обматывает полученное значение в monad.

Так что, если вы soemthing как,

scala>:pa 
// Entering paste mode (ctrl-D to finish 

for{ 
    l <- Some(List(1, 2, 3)) 
    i <- Some(1) 
} yield (l, i) 

// Exiting paste mode, now interpreting. 
res1: Option[(List[Int], Int)] = Some((List(1, 2, 3),1)) 

Также ... Ваша модель данных чувствует своего рода неправильно.

Что такое recipients ?? Скажите мне, что, возможно, я смогу решить вашу проблему лучше и эффективнее.

Но учитывая то, что я могу догадаться о вашей модели данных, теперь, если вы хотите, список получателей правильный путь, вы должны сделать что-то подобное,

// List[ (Message, List[ Recipients]) ] 
val messageAndRecipentsList = (for { 

    // First get all possible recipents 
    possibleRecipient <- recipients if possibleRecipient.targetID === targetID 

    // Now get all relevant messages for sender and possibleRecipeint 
    message <- messages if message.senderID === senderID || message.id === possibleRecipient.messageID 

    // Now get list of recipents for each of these messages 
    messageRecipients <- for { 
    messageRecipient <- recipients if messageRecipient.messageID === message.id 
    } yield (messageRecipient).list 

} yield (message, messageRecipients)).list 

// Now lets add sender for each of these messages, I am guessing sender 
// should be exactly one for each sendorId. So... instead of querying for 
// same user for every message lets just query it once and add to every 
// tuple of the above list, 

val sender = (for { 
    sender <- Users.users if sender.id === senderID 
} yield sender).list.head 


val finalList = messageAndRecipentsList.map ({ 
    case (message, msaageRecipents) => new FullMessage(message, sender, messageRecipients) 
}) 
+0

Отредактированный вопрос. Похоже, я не могу использовать .list в запросе внутри запроса. Это не дает мне ничего как результат по родительскому запросу, если я его использую. – adheus

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