我会反过来……选择消息,然后找到它们的根源。
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)