2011-12-06 12 views
5

tengo los dos modelos siguientes:rieles roscados mensajes privados

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 

se permite a cada usuario tener una conversación con otro usuario y todas las respuestas debe ser roscado del mensaje original.

En mi acción de control 'índice', ¿cómo consulto tanto los mensajes enviados como los recibidos? Por ejemplo, si el Usuario1 golpea '/ users/2/messages /' debería ver toda la conversación entre usuario1 y usuario2 (independientemente de quién haya enviado el primer mensaje). ¿Debo agregar un modelo 'Thread' o hay alguna forma de lograrlo con mi estructura actual?

Gracias.

Respuesta

16

Puede que sea mejor reestructurar esto como una conversación a la que puede unirse gente que una serie de mensajes interconectados en una cadena. Por ejemplo:

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 

Cuando se envía un mensaje a alguien, crear una conversación por ella e invitar a las partes apropiadas mediante su inclusión en la lista users.

Los mensajes con subprocesos se pueden agregar creando una relación principal en el mensaje o utilizando ancestros, aunque en la práctica esto tiende a sobreestimarse ya que el simple orden cronológico de las respuestas suele ser suficiente para la mayoría de las personas.

Para rastrear el estado de lectura/no lectura, necesitará una tabla de asociación entre el usuario y los mensajes directamente, y esto puede ser complicado, así que evítelo a menos que lo necesite.

Tenga en cuenta que algunos nombres están reservados por Ruby o Rails, y Thread es uno de ellos, por lo que no puede tener un modelo con ese nombre.

+1

Estaba buscando una manera de hacer conversaciones simples entre 2 usuarios cuando encontré esto. Parece que funcionará. ¡Gracias! ¿Pero no debería ser 'has_many: conversaciones,: a través =>: participantes' en el modelo de Usuario? – Vickash

+1

Tiene razón acerca de la falta ': a través' en el modelo de Usuario. También debería tener 'has_many: participantes' también. – tadman

+0

Acabo de utilizar este modelo en mi aplicación pero realmente estoy luchando por tener un controlador escrito para crear y responder mensajes. ¿Hay alguna posibilidad de un simple ejemplo? Puedo comenzar como una nueva pregunta si eso es mejor. – Dave

Cuestiones relacionadas