2011-12-06 11 views
5

Mam następujące dwa modele:Szyny gwintowane Prywatne wiadomości

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 

Każdy użytkownik może mieć jedną rozmowę z innym użytkownikiem i wszystkie odpowiedzi powinny być gwintowany z oryginalnej wiadomości.

W moim działaniu kontrolera "indeks" w jaki sposób mogę wysyłać zapytania zarówno do wysłanych wiadomości, jak i odebranych wiadomości? Na przykład, jeśli użytkownik 1 trafi "/ users/2/messages /", powinien zobaczyć całą konwersację między użytkownikiem 1 i użytkownikiem 2 (niezależnie od tego, kto wysłał pierwszą wiadomość). Czy muszę dodać model "wątku" lub czy istnieje sposób, aby to osiągnąć przy mojej obecnej strukturze?

Dzięki.

Odpowiedz

16

Być może lepiej będzie, jeśli przeprowadzisz restrukturyzację jako rozmowę, do której możesz dołączyć, niż serię powiązanych ze sobą wiadomości w łańcuchu. Na przykład:

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 

Gdy wiadomość jest wysyłana do kogoś, należy utworzyć dla niego rozmowy i zaprosić odpowiednie partie, dodając je do listy users.

Wiadomości z wątku można dodać tutaj, budując relację nadrzędną z samą wiadomością lub używając przodków, choć w praktyce ma to tendencję do nadmiernego zabijania, ponieważ proste uporządkowanie odpowiedzi jest zwykle wystarczające dla większości ludzi.

Aby śledzić stan przeczytania/nieprzeczytania, potrzebna będzie tabela powiązań między użytkownikiem a wiadomościami bezpośrednio, co może być trudne, dlatego należy tego unikać, chyba że jest to potrzebne.

Należy pamiętać, że niektóre nazwy są zastrzeżone przez Ruby lub Rails, a Thread jest jednym z nich, więc nie można mieć modelu o tej nazwie.

+1

Szukałem sposobu na proste rozmowy między 2 użytkownikami, gdy to znalazłem. Wygląda na to, że to zadziała. Dzięki! Ale czy nie powinno to być 'has_many: conversations,: through =>: participants' w modelu użytkownika? – Vickash

+1

Masz rację co do brakującego ': through' w modelu użytkownika. Powinien także mieć 'has_many: participants'. – tadman

+0

Właśnie użyłem tego modelu w mojej aplikacji, ale naprawdę staram się napisać sterownik do tworzenia i odpowiadania na wiadomości. Czy jest jakaś szansa na prosty przykład? Mogę zacząć to jako nowe pytanie, jeśli to lepiej. – Dave