0

我正在使用 awesome_nested_set 来建立邮件对话。我有两个邮箱(收件箱和已发送),现在我想建立一个适当的对话视图。主要目标是选择在目标邮箱中有任何后代的根和根的最后一个叶子,以便在对话列表页面上查看。我的消息模型:

class Message
 belongs_to :mailbox
 acts_as_nested_set
 ...
end

例如,如果我选择收件箱,我想选择:那些有属于收件箱的任何消息的根。我该怎么做?我是否需要为此构建一个包含 message_id、mailbox_id、unique_thread_number 的对话模型?

4

1 回答 1

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)

在上述逻辑中,我不使用任何过滤,这意味着在开始时我为所有输入选择 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)
于 2014-12-09T21:45:52.380 回答