У меня есть Conversation
модель, которая has_many
messages
.Я хочу получить все разговоры для пользователя и отобразить последний предварительный просмотр message
для пользователей.Я делаю это следующим образом:
Conversations_controller
:
def index
@conversations = Conversation.includes(:messages)
.get_seller_conversations(@seller)
end
Conversation
модель:
def self.get_seller_conversations(seller)
@conversations = seller.conversations
.includes(buyer: :user)
.joins(:messages)
.where(messages: { only_for_buyer: false })
.distinct
new.sorted_conversations(@conversations)
end
def sorted_conversations(conversations)
conversations.sort_by { |c| c.messages.last.created_at }
.reverse
end
index.json.jbuilder
-> просмотр
json.array!(@conversations.reject { |c| c.messages == [] }.map do |c|
x = c.messages.last
{ ...
...
preview: x.content ? x.content[0..100] : x.attachment_url }
end)
Поэтому мне нужно вытащить все сообщения сюда, чтобы отсортировать разговоры и показать предварительный просмотр последнего сообщения.Есть ли способ, которым я могу получить только последнее сообщение для каждого разговора и тем самым сделать его более эффективным?