Ruby on rails 如何订购邮箱收件箱?

Ruby on rails 如何订购邮箱收件箱?,ruby-on-rails,ruby,ruby-on-rails-4,mailboxer,Ruby On Rails,Ruby,Ruby On Rails 4,Mailboxer,我在rails应用程序中使用mailboxergem,我想对收件箱中的消息进行排序,这样当用户收到一条新消息时,我希望收到一个通知或跟踪哪些消息已被读取,哪些消息未被读取,并将未读/新消息排序在页面顶部 这是我的对话控制器 class ConversationsController < ApplicationController before_action :get_mailbox before_action :get_conversation, except: [:index]

我在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
但它没有起作用


请提出一个解决方案。

好的-所以我只需要浏览一下这里的文档

\u read
在其他地方为您工作过吗?我可以找到的方法和属性是
#标记为已读
收据。是否未读?
;您是否尝试过通过
is\u unread
进行组织,或者尝试过在控制台中对此进行一些调试

以下是我一直在挖掘的资源:


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

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

    我不知道这个宝石。这是我的2美分

    为了对消息进行分页,Mailboxer必须在内部指定SQL顺序。要知道它的顺序,请查看Rails日志。我想你会得到类似于在DESC,mailboxer,receipts.is\u read创建的
    订单(我已经添加了你的订单)

    要更改此优先级,您必须对查询进行无序排序,并首先放置is\u read条件。您可以通过以下方式完成此操作:

    @对话=
    @信箱
    .收件箱(
    第页:参数[:第页],
    每页:10
    ).joins(:收据)
    .选择(“邮箱地址对话。*,邮箱地址收据。*”)
    .reorder('mailboxer\u receipts.is\u read,无论您在SQL查询中拥有什么')
    
    希望这有助于。。。 祝你今天过得愉快:)

    编辑

    通过查看Mailboxer Gem,我确认存在内部订单():查看参与者和收件箱范围

    范围:参与者,lambda{124;参与者|
    其中('mailboxer\u notifications.type'=>mailboxer::Message.name)。
    订单(“mailboxer_conversations.updated_at DESC”)。
    joins(:receives).merge(Mailboxer::receive.receiver(participant)).uniq
    }
    范围:收件箱,lambda{|参与者|
    参与者(参与者).merge(邮箱:receive.inbox.not_trash.not_deleted)
    }
    
    此外,您只需在收件箱呼叫前写下订单,即可正常工作:

    @对话=
    @信箱
    .order('mailboxer\u receipts.is\u read')
    .收件箱(
    第页:参数[:第页],
    每页:10
    ).joins(:收据)
    .选择(“邮箱地址对话。*,邮箱地址收据。*”)
    
    试试这个

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

    默认情况下,收件箱被排序为在顶部显示最新邮件,例如,当您键入
    @mailbox.inbox时。首先
    您实际上正在提取最后一封(最新)邮件。

    您可以通过执行以下操作来选中“收集所有未读邮件”:

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

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

    获取此错误
    nomethoder错误:未定义的方法#`
    
     @unread = @conversations.select{ |c| c.is_unread?(current_user) }