5 Stimmen

Private Nachrichten mit Threads in Rails

Ich habe die folgenden zwei Modelle:

class Message < ActiveRecord::Base
  belongs_to :to_user, :class_name => 'User'
  belongs_to :from_user, :class_name => 'User'

  has_ancestry #Using the 'ancestry' gem
end

class User < ActiveRecord::Base
  has_many :messages_received, :class_name => 'Message', :foreign_key => 'to_user_id'
  has_many :messages_sent, :class_name => 'Message', :foreign_key => 'from_user_id'
end

Jeder Benutzer darf eine Unterhaltung mit einem anderen Benutzer führen, und alle Antworten sollten von der ursprünglichen Nachricht abgeleitet sein.

Wie kann ich in meiner "Index"-Controller-Aktion sowohl gesendete als auch empfangene Nachrichten abfragen? Wenn Benutzer1 zum Beispiel auf "/users/2/messages/" zugreift, sollte er die gesamte Konversation zwischen Benutzer1 und Benutzer2 sehen (unabhängig davon, wer die erste Nachricht gesendet hat). Muss ich ein "Thread"-Modell hinzufügen oder gibt es eine Möglichkeit, dies mit meiner derzeitigen Struktur zu erreichen?

Danke.

16voto

tadman Punkte 200181

Es ist vielleicht besser, dies als eine Konversation umzustrukturieren, an der Sie sich beteiligen können, als eine Reihe miteinander verbundener Nachrichten in einer Kette. Zum Beispiel:

class Conversation < ActiveRecord::Base
  has_many :messages
  has_many :participants
  has_many :users, :through => :participants
end

class Message < ActiveRecord::Base
  belongs_to :conversation
end

class Participant < ActiveRecord::Base
  belongs_to :conversation
  belongs_to :user
end

class User < ActiveRecord::Base
  has_many :conversations
  has_many :participants
end

Wenn eine Nachricht an jemanden gesendet wird, erstellen Sie eine Konversation für diese Nachricht und laden die entsprechenden Parteien ein, indem Sie sie zur users Liste.

Threaded Messaging könnte hier hinzugefügt werden, indem man eine übergeordnete Beziehung in die Nachricht selbst einbaut oder Ahnenforschung einsetzt, obwohl dies in der Praxis eher ein Overkill ist, da eine einfache chronologische Anordnung der Antworten für die meisten Leute ausreichend ist.

Um den Status "gelesen/ungelesen" zu verfolgen, benötigen Sie eine Assoziationstabelle zwischen Benutzer und Nachrichten, und das kann schwierig sein, also vermeiden Sie es, wenn Sie es nicht brauchen.

Beachten Sie, dass einige Namen entweder von Ruby oder Rails reserviert sind, und Thread ist einer von ihnen, also können Sie kein Modell mit diesem Namen haben.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X