Skip to content

Commit ca329d1

Browse files
committed
Select thread messages with recursive query
1 parent 7960134 commit ca329d1

File tree

1 file changed

+17
-1
lines changed

1 file changed

+17
-1
lines changed

app/controllers/messages_controller.rb

Lines changed: 17 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,10 @@ class MessagesController < ApplicationController
55
def index
66
if (list_name = params[:list_name])
77
@list = List.find_by_name list_name
8-
@messages = Message.where(list_id: @list.id).order(:id)
8+
9+
messages = Message.with_recursive(parent_and_children: [Message.where(list_id: @list.id, parent_id: nil).order(:id).limit(100), Message.joins('inner join parent_and_children on messages.parent_id = parent_and_children.id')])
10+
.joins('inner join parent_and_children on parent_and_children.id = messages.id')
11+
@messages = compose_tree(messages)
912
elsif (query = params[:q])
1013
search query
1114

@@ -47,4 +50,17 @@ def search(query)
4750
message_where = Message.where('body %> ? AND list_id IN (?)', query, list_ids).order(Arel.sql('body <-> ?', query))
4851
@messages = message_where.offset(page * PER_PAGE).limit(PER_PAGE)
4952
end
53+
54+
def compose_tree(messages)
55+
[].tap do |ret|
56+
messages.each do |m|
57+
if m.parent_id && (parent = messages.detect { it.id == m.parent_id })
58+
(parent.children ||= []) << m
59+
else
60+
ret << m
61+
end
62+
end
63+
ret.sort_by!(&:id)
64+
end
65+
end
5066
end

0 commit comments

Comments
 (0)