2015-07-07 15 views
14

Sto usando la gemma mailboxer con la mia applicazione di rotaie e voglio ordinare i messaggi della mia casella di posta in modo che quando l'utente riceve un nuovo messaggio, vorrei ricevere una notifica o tenere traccia di quali messaggi sono stati letti e quali no e ordina ai messaggi di avere i messaggi non letti/nuovi nella parte superiore della pagina.Come ordinare la mailbox in arrivo?

Ecco le mie conversazioni regolatore

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 

Ho cercato di ordinare la posta da:

ma non ha funzionato.

Si prega di suggerire una soluzione.

risposta

-1

Credo che quello che stai cercando è la seguente:

 

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

Non conosco questa gemma. Ci sono comunque i miei 2 centesimi ...

Per impaginare i messaggi, Mailboxer deve specificare un ordine SQL internamente. Per sapere quale ordine è, controlla i log di Rails. Suppongo che riceverai qualcosa come ORDER BY created_at DESC, mailboxer_receipts.is_read (ho aggiunto il tuo ordine).

Per modificare questa priorità, dovrete unorder la query e inserire il vostro is_read criteri prima. Sarete in grado di fare questo con qualcosa di simile:

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

Spero che questo aiuti ... Have a nice day comunque :)

modificare:

Osservando nel Mailboxer Gemma, confermo che è presente un ordine interno (https://github.com/mailboxer/mailboxer/blob/51fd6391592aace8a8eb3d1b1a761a9bea81fe1b/app/models/mailboxer/conversation.rb): vedere gli spettatori partecipante e inbox.

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

Inoltre, dovrete semplicemente scrivere il vostro ordine prima che la casella di posta chiamata e dovrebbe funzionare come si desidera:

@conversations = 
    @mailbox 
    .order('mailboxer_receipts.is_read') 
    .inbox(
     page: params[:page], 
     per_page: 10 
    ).joins(:receipts) 
    .select("mailboxer_conversations.*, mailboxer_receipts.*") 
+0

ottenendo questo errore 'NoMethodError: metodo non definito' order 'per # ' –

1

provare questo,

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

e per impostazione predefinita la posta in arrivo viene ordinata per mostrare il messaggio più recente in alto, ad esempio quando si digita @mailbox.inbox.first in realtà si sta tirando l'ultimo (più recente) messaggio.

0

È possibile controllare raccogliere tutti i messaggi non letti nel modo seguente:

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

Questo passerà attraverso le conversazioni e restituire un array di solo i messaggi non letti. Stai dicendo che vuoi che la Posta in arrivo abbia il messaggio non letto per primo, anche se ci sono nuovi messaggi già letti?

Problemi correlati