14

Railsアプリケーションでgemを使用mailboxerしています。ユーザーが新しいメッセージを受信したときに通知を受け取るか、どのメッセージが読まれたか、どのメッセージが読まれていないかを追跡して、ページの上部に未読/新しいメッセージを表示するメッセージ。

これが私の会話コントローラーです

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

次のようにして、すべての未読メッセージを収集して確認できます。

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

これはすべての会話を通過し、未読メッセージのみの配列を返します。既読の新しいメッセージがある場合でも、受信トレイに最初に未読を入れたいと言っているのですか?

于 2015-08-11T20:33:11.513 に答える
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

わかりました-ここでドキュメントを調べているのは私が持っているものです.

#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 に答える