Последнее сообщение в разговоре для предварительного просмотра - PullRequest
0 голосов
/ 25 апреля 2018

У меня есть 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)

Поэтому мне нужно вытащить все сообщения сюда, чтобы отсортировать разговоры и показать предварительный просмотр последнего сообщения.Есть ли способ, которым я могу получить только последнее сообщение для каждого разговора и тем самым сделать его более эффективным?

1 Ответ

0 голосов
/ 25 апреля 2018

Вы можете добавить отношение в вашей модели Conversation к последнему сообщению:

has_one :last_message, -> { order(created_at: :desc) }, source: :message

И затем в своем поиске вместо выполнения Conversation.includes(:messages) вы делаете Conversation.includes(:last_message)

...