2016-08-29 5 views
0

Ein Zeichen has_many :conversations through: chats, und jede Konversation has_many :messages. Wenn ich @character.conversations anrufe, möchte ich, dass die Konversationen zum Zeitpunkt der Erstellung der letzten Nachricht der Konversation geordnet werden. Wie ist das codiert?Schienen, Auftragserfassung durch zweischichtige Assoziation

character.rb

has_many :chats, foreign_key: "character_id", 
has_many :conversations, through: :chats, source: :conversation 
# order: "conversation.messages.last.created_at DESC" # doesn't work 

conversation.rb

has_many :chats, foreign_key: "conversation_id" 
has_many :characters, through: :chats, source: :character 
has_many :messages 

Antwort

1

können Sie fügen eine default_scope zu conversation.rb:

default_scope -> {includes(:messages).order('messages.created_at DESC')} 

Hinweis:default_scope würde sicherlich die Leistung beeinträchtigen, da die Abfrage die ganze Zeit ausgeführt wird, wenn Sie auf eine Konversation zugreifen. Ein besserer Ansatz wäre es, einen separaten Bereich zu erstellen, den Sie bei Bedarf aufrufen können.

+0

Ich habe die default_scope hinzugefügt Sie ** conversation.rb vorgeschlagen **, aber es scheint nicht, Um die Reihenfolge der Konversationen zu beeinflussen, sortiert sie die Nachrichten innerhalb jeder Konversation. Ich möchte, dass es die Gespräche selbst bestellt? – Bazley

+0

@Bazley kannst du '@ character.conversations' einfach machen und die generierte ** SQL ** posten? Sie können dies in Ihrer Konsole ausprobieren und die 'ORDER BY messages.created_at DESC'-Klausel sehen. – dp7

0

können Sie gelten zusätzliche Bereiche der Beziehung, auch wenn es mehrschichtig:

@character.conversations.joins(:messages).order('messages.created_at DESC') 
Verwandte Themen