Как заказать почтовый ящик почтового ящика?

Я использую mailboxer gem с моим приложением rails, и я хочу заказать мои сообщения в ящике, чтобы, когда пользователь получил новое сообщение, я хотел бы получить уведомление или отслеживать, какие сообщения были прочитаны и которые не имеют и заказывают сообщения, чтобы иметь непрочитанные/новые сообщения в верхней части страницы.

Вот мой контроллер цепочек

class ConversationsController < ApplicationController
  before_action :get_mailbox
  before_action :get_conversation, except: [:index]

  def index
    @unread_messages = @mailbox.inbox(unread: true).count
    @conversations = @mailbox.inbox({page: params[:page], per_page: 10})
  end

  private

  def get_conversation
    @conversation ||= @mailbox.conversations.find(params[:id])
  end

  def get_mailbox
    @mailbox ||= current_user.mailbox
  end
end

Я попытался заказать почту:

@conversations = @mailbox.inbox({page: params[:page], per_page: 10}).joins(:receipts).select("mailboxer_conversations.*, mailboxer_receipts.*").order('mailboxer_receipts.is_read')

но это не сработало.

Пожалуйста, предложите решение.

Ответы

Ответ 1

попробуйте это,

def index
  @unread_messages = @mailbox.inbox(is_read:false).count
  @conversations = @mailbox.inbox.page(params[:page]).per(10)
end

и по умолчанию в папке "Входящие" указано, чтобы показывать самое новое сообщение сверху, например, когда вы введете @mailbox.inbox.first, вы фактически вытаскиваете последнее (новейшее) сообщение.

Ответ 2

Хорошо, поэтому просмотр документов - вот что у меня есть.

Имел ли #is_read для вас в другом месте? Методами и атрибутами, которые я мог отслеживать, являются #mark_as_read и receipt.is_unread?; вы попробовали организовать вместо is_unread или попытались немного отладить это в консоли?

Вот ресурсы, которые я рыл:

Ответ 3

Я не знаю этого драгоценного камня. В любом случае, мои 2 цента...

Чтобы разбивать ваши сообщения, Mailboxer должен указать внутренний SQL-запрос. Чтобы узнать, какой именно заказ, проверьте свои журналы Rails. Я полагаю, вы получите что-то вроде ORDER BY created_at DESC, mailboxer_receipts.is_read (я добавил ваш заказ).

Чтобы изменить этот приоритет, вам нужно будет разупорядочить запрос и сначала поместить критерии is_read. Вы сможете сделать это с помощью:

@conversations =
  @mailbox
    .inbox(
      page: params[:page],
      per_page: 10
    ).joins(:receipts)
    .select("mailboxer_conversations.*, mailboxer_receipts.*")
    .reorder('mailboxer_receipts.is_read, WHATEVER_YOU HAD IN YOUR SQL query')

Надеюсь, что это поможет... Иметь хороший день в любом случае:)

изменить:

Посмотрев в Gmail почтового ящика, я подтверждаю, что существует внутренний порядок (https://github.com/mailboxer/mailboxer/blob/51fd6391592aace8a8eb3d1b1a761a9bea81fe1b/app/models/mailboxer/conversation.rb): см. области участия и области входящих сообщений.

scope :participant, lambda {|participant|
  where('mailboxer_notifications.type'=> Mailboxer::Message.name).
  order("mailboxer_conversations.updated_at DESC").
  joins(:receipts).merge(Mailboxer::Receipt.recipient(participant)).uniq
}
scope :inbox, lambda {|participant|
  participant(participant).merge(Mailboxer::Receipt.inbox.not_trash.not_deleted)
}

Кроме того, вам просто нужно написать свой заказ перед вызовом inbox, и он должен работать так, как вы хотите:

@conversations =
  @mailbox
    .order('mailboxer_receipts.is_read')
    .inbox(
      page: params[:page],
      per_page: 10
    ).joins(:receipts)
    .select("mailboxer_conversations.*, mailboxer_receipts.*")

Ответ 4

Вы можете проверить сбор всех непрочитанных сообщений, выполнив следующие действия:

 @unread = @conversations.select{ |c| c.is_unread?(current_user) }

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

Ответ 5

Я считаю, что вы ищете следующее:


@conversations = @mailbox.inbox.select('mailboxer_conversations.*, bool_and(is_read) AS all_read').group('mailboxer_conversations.id').order('all_read ASC')