2014-12-09 1 views
0

Я использую awesome_nested_set для создания почтовых сообщений. У меня есть два почтовых ящика («Входящие» и «Отправленные»), и теперь я хочу создать правильный диалог. Основная цель - выбрать корни, которые имеют потомки в целевом почтовом ящике и последний лист корня для просмотра на странице списка разговора. Моя модель сообщений:Разговор для почтового ящика с использованием awesome_nested_set

class Message 
belongs_to :mailbox 
acts_as_nested_set 
... 
end 

E.g. Если я выбрал папку «Входящие», я бы хотел выбрать: у корней есть какое-либо сообщение с папкой «Входящие». Как я могу выбрать? Нужно ли мне создавать модель диалога, которая для этого имела бы message_id, mailbox_id, unique_thread_number?

ответ

0

Я бы обратился вспять ... Выберите сообщения, а затем получите свои корни.

messages=Message.where(mailbox: "inbox").map(&:id) 
roots=Message.where('id in (?)',Message.where('id in (?)',messages).map {|p| p.root.id}) 
leaf_ids = roots.map {|p| p.leaves.last.id if p.leaves.any?} 
leaves=Message.where('id in (?)', leaf_ids) 

В приведенной выше логике я не использую никакой фильтрации, это означает, что при запуске я выбираю идентификаторы для всех messages в inbox ... Я думаю, вы должны добавить некоторую фильтрацию (where дизъюнкцию), чтобы сузить результаты вниз.

Тогда вы получите roots для тех сообщений

Тогда вы получите leaf_ids этих корней

Ваши желательные читаемые сообщения будут leaves.

Обновлено Теперь, когда я вижу его, вы можете сделать это с одним меньшим шагом (если вам не нужны сами корни):

messages= Message.where(mailbox: "inbox").map(&:id) 
leaf_ids= Message.where('id in (?)',Message.where('id in (?)',messages). 
        map {|p| p.root.leaves.last.id if p.root.leaves.any?}) 
leaves = Message.where('id in (?)',leaf_ids) 
+0

Спасибо за ваш ответ, но этот подход Безразлично» t помощь в разговоре начинается с отправленной папки. –

+0

@AlexanderShlinchack, извините за это ... У меня есть небольшое впечатление, что есть некоторая обратная связь. Вы думаете, что можете представить краткий, но исчерпывающий пример в своем вопросе? –