Как заказать почтовый ящик почтового ящика?
Я использую 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')