如何订购邮箱收件箱?

时间:2015-07-07 04:19:28

标签: ruby-on-rails ruby ruby-on-rails-4 mailboxer

我在我的rails应用程序中使用mailboxer 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')

但它没有用。

请提出解决方案。

5 个答案:

答案 0 :(得分:1)

试试这个,

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

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

答案 1 :(得分:0)

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

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

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

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

  2. cannot figure out how to update mailboxer is_read

答案 2 :(得分: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.*")

答案 3 :(得分:0)

您可以通过执行以下操作检查收集所有未读邮件:

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

这将遍历所有会话并返回仅有未读消息的数组。你是说你希望收件箱首先有未读信息,即使有更新的信息已被读取?

答案 4 :(得分:-1)

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

<body>
<div class="ct-chart ct-perfect-fourth" id="myChart"></div>   
</body>

new Chartist.Line(
    '#myChart',
    {
         labels: ['Week 1', 'Week 2', 'Week 3', 'Week 4', 'Week 5'],
         series: [ [560, 600, 840, 900, 400] ]
    }, 
    {divisor: 250}
);