我在我的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')
但它没有用。
请提出解决方案。
答案 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?
组织,或者在控制台中尝试对此进行一些调试?
以下是我正在挖掘的资源:
答案 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}
);