14

我在mailboxer我的 Rails 应用程序中使用 gem,我想订购我的收件箱消息,以便当用户收到新消息时,我想收到通知或跟踪哪些消息已被阅读,哪些消息尚未阅读并订购消息以在页面顶部显示未读/新消息。

这是我的对话控制器

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')

但它没有奏效。

请提出解决方案。

4

5 回答 5

1

尝试这个,

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

并且默认情况下,收件箱按顺序在顶部显示最新消息,例如,当您键入时,@mailbox.inbox.first您实际上是在拉最后一条(最新)消息。

于 2015-07-22T08:29:58.403 回答
0

好的 - 所以查看这里的文档就是我所拥有的。

在其他地方#is_read为你工作过吗?我可以追踪的方法和属性是#mark_as_readreceipt.is_unread?;您是否尝试过组织is_unread或尝试在控制台中对此进行一些调试?

以下是我正在挖掘的资源:

  1. http://www.rubydoc.info/gems/mailboxer/frames

  2. 无法弄清楚如何更新邮箱 is_read

于 2015-07-07T07:14:50.503 回答
0

我不知道这个宝石。反正有我的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')

希望这会有所帮助...祝您有愉快的一天:)

编辑

通过查看 Mailboxer Gem,我确认有一个内部订单(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)
}

此外,您只需在收件箱调用之前写下您的订单,它应该可以按照您的意愿工作:

@conversations =
  @mailbox
    .order('mailboxer_receipts.is_read')
    .inbox(
      page: params[:page],
      per_page: 10
    ).joins(:receipts)
    .select("mailboxer_conversations.*, mailboxer_receipts.*")
于 2015-07-14T12:35:06.340 回答
0

您可以通过执行以下操作来检查收集所有未读消息:

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

这将遍历所有对话并返回仅包含未读消息的数组。你是说你希望收件箱先有未读的邮件,即使有新的邮件已经读过?

于 2015-08-11T20:33:11.513 回答
-1

我相信您正在寻找的是以下内容:


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

于 2015-07-10T12:14:34.483 回答