Ich schreibe ein Facebook-Nachrichtensystem für eine Rails App und ich habe Probleme beim Auswählen der Nachrichten für den Posteingang (mit will_paginate).Tricky MySQL Query für Messaging-System in Rails - Bitte Hilfe
Die Nachrichten sind in Threads organisiert, im Posteingang wird die letzte Nachricht eines Threads mit einem Link zum Thread angezeigt. Der Thread ist über eine parent_id 1-n-Beziehung mit sich selbst organisiert.
Bisher bin ich mit so etwas wie dies:
class Message < ActiveRecord::Base
belongs_to :sender, :class_name => 'User', :foreign_key => "sender_id"
belongs_to :recipient, :class_name => 'User', :foreign_key => "recipient_id"
has_many :children, :class_name => "Message", :foreign_key => "parent_id"
belongs_to :thread, :class_name => "Message", :foreign_key => "parent_id"
end
class MessagesController < ApplicationController
def inbox
@messages = current_user.received_messages.paginate :page => params[:page], :per_page => 10, :order => "created_at DESC"
end
end
Das bin ich alle Nachrichten gibt, aber für einen Thread der Thread selbst und die jüngste Meldung erscheint (und nicht nur die neueste Meldung). Ich kann auch nicht die GROUP BY-Klausel verwenden, weil für den Thread selbst (sozusagen das Elternteil) die parent_id = nil natürlich ist.
Wer hat eine Idee, wie man das elegant löst? Ich habe bereits darüber nachgedacht, die parent_id dem übergeordneten Element selbst hinzuzufügen und dann mit parent_id zu gruppieren, bin mir aber nicht sicher, ob das funktioniert.
Dank
Ich würde nicht die Parent_id zum Eltern hinzufügen ..., die dann die Möglichkeit der Erweiterung der Benutzeroberfläche zu mehrstufigen Threads entfernt (Ihr Datenmodell unterstützt derzeit dies, aber ich rate Ihre UI wird nicht oder Sie würden diese Lösung nicht in Betracht ziehen :)) – workmad3
Ich weiß, aber ich denke, dass ich diese Möglichkeit für eine schnelle und effiziente DB-Abfrage aufgeben kann. Grundsätzlich sind alle Nachrichten immer in einem Thread und sind immer nach Zeit geordnet (created_at stamp). Jede andere Art der Darstellung wäre sinnlos und könnte mit den Zeitstempeln modelliert werden. –