2011-12-06 14 views
5

Ho le seguenti due modelli:Rails filettati messaggistica privata

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 

Ogni utente è permesso di avere una conversazione con un altro utente e tutte le risposte devono essere filettato dal messaggio originale.

Nell'azione del controller 'indice' come si interrogano sia i messaggi inviati che i messaggi ricevuti? Ad esempio, se Utente1 fa clic su "/ users/2/messages /" dovrebbero vedere l'intera conversazione tra user1 e user2 (indipendentemente da chi ha inviato il primo messaggio). Devo aggiungere un modello "Thread" o esiste un modo per farlo con la mia attuale struttura?

Grazie.

risposta

16

Potrebbe essere meglio ristrutturarlo come una conversazione a cui è possibile unire le persone rispetto a una serie di messaggi interconnessi in una catena. Per esempio:

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 

Quando un messaggio viene inviato a qualcuno, creare una conversazione per esso e invita le parti appropriate aggiungendoli alla lista users.

messaggistica filettato potrebbe essere aggiunto qui con la costruzione di una relazione padre nel messaggio stesso oppure utilizzando antenati, anche se in pratica questo tende ad essere eccessivamente uccidere come semplice ordine cronologico delle risposte è solitamente sufficiente per la maggior parte delle persone.

Per tenere traccia dello stato letto/non letto è necessaria una tabella di associazione tra utente e messaggi direttamente, e questo può essere complicato, quindi evitarlo a meno che non ne abbiate bisogno.

Ricordare che alcuni nomi sono riservati a Ruby o Rails e che Thread è uno di questi, quindi non è possibile avere un modello con quel nome.

+1

Stavo cercando un modo per fare semplici conversazioni tra 2 utenti quando ho trovato questo. Sembra che funzionerà. Grazie! Ma non dovrebbe essere "has_many: conversations,: through =>: participants' nel modello User? – Vickash

+1

Hai ragione riguardo alla mancanza di ': through' nel modello Utente. Dovrebbe anche avere 'has_many: participants' pure. – tadman

+0

Ho appena usato questo modello nella mia app, ma ho davvero difficoltà a far scrivere un controller per creare e rispondere ai messaggi. C'è qualche possibilità di un semplice esempio? Posso iniziare come una nuova domanda se è meglio. – Dave

Problemi correlati