2011-02-24 3 views
0

Hey, J'essaie de mettre en œuvre un système de messagerie tel qu'il est utilisé dans les réseaux sociaux. Le problème auquel je suis confronté concerne d'abord la structure de la base de données et ensuite comment l'implémenter dans les rails.
Ma première idée est que je utilise 3 tables:Rails système de messagerie privé

messages: id | sujet | texte | created_at
récepteurs: id | message_id | lire: booléens
créateurs: id | message_id | lire: Boolean

maintenant je me demande comment implémenter les fonctionnalités suivantes:
1.) un utilisateur peut supprimer son message. mais comme les deux veulent lire le message, comment s'assurer que le message n'est supprimé que lorsque les deux utilisateurs l'ont supprimé.
2.) comment implémenter une réponse? ou en fait comment puis-je trouver le créateur correspondant? 3. comment savoir si un message a été lu par le destinataire?

Une autre idée est: creator_messages: id | creator_id | receiver_id | sujet | texte | lu | created_at receiver_messages: comme creator_messages

cette distinction entre les utilisateurs, afin qu'ils puissent supprimer individuellement leurs messages. mais comment puis-je savoir si le courrier a été lu ou non? Ma troisième approche était fondamentalement mon deuxième mais seulement un des messages de table, puis l'affichage à l'utilisateur.
1. le message est supprimé dès que l'un des utilisateurs le supprime.
2. en fait, comment puis-je représenter les relations comme has_many et appartient?

Je pensais que cela fonctionnerait comme ceci:

model User 
    :has_many :send_messages, :class_name=>"messages", :foreign_key=>"creator_id" 
    :has_many :received_messages, :class_name=>"messages", :foreign_key=>"receiver_id" 
end 

model Messages 
    belongs_to :user 
end 

mais en quelque sorte je n'ai pas à travailler. Je suppose qu'il me manque quelque chose de fondamental ici.

quelqu'un L'espoir peut me aider =) Merci beaucoup

+0

Il devrait être ': send_messages', si l'autre est': received_messages' :) –

+0

Je n'ai pas essayé de mettre en place un système de messagerie privé mais si je dois le faire, je vais creuser dans le code insoshi (https://github.com/insoshi/insoshi) ou vérifiez ce plugin: https://github.com/professionalnerd/simple-private-messages (travail avec Restful Authentication). J'espère que cela pourrait aider ... – benoitr

+0

hey, pourquoi vous voulez plusieurs créateurs pour les messages et pas seulement creator_id dans le modèle de messages? –

Répondre

1

ok, si je comprends bien, les messages auraient un maximum de 1 récepteur et 1 expéditeur. Dans ce cas, je ferais ce qui suit:

Je voudrais créer simplement un modèle de messages, cela aurait les champs supplémentaires - receiver_read - receiver_deleted - sender_deleted

Maintenant, vous pouvez ajouter des crochets au modèle comme "after_save", "after_create" ici vous pouvez vérifier si le receiver_read vient d'être mis à true via par exemple avec le receiver_read_changed? méthode, si cela est vrai, vous pouvez informer l'expéditeur ou faire quelque chose d'autre avec lui. Avec ce hook after_save, vous pouvez également vérifier que si le sender_deleted est simplement défini sur true et que receiver_deleted est déjà vrai, vous supprimez le message entier.

Lorsque vous avez plusieurs récepteurs, je créer un modèle de jointure pour les récepteurs et avoir les attributs sender_deleted et sender_id dans le modèle de message. Dans le modèle de jointure, j'ajouterais les colonnes receiver_id, read et deleted. Maintenant, je voudrais utiliser la méthode before_save sur les messages et les modèles de jointure pour vérifier si le message doit être supprimé ou si l'expéditeur doit être averti du message qui a été lu.

+0

merci bien cette suppression devrait fonctionner – Jan

0

La solution pourrait être:

1) Je créerais un supprimé (_A) drapeau dans la table des récepteurs aussi bien, si vous voulez vraiment hard-supprimer les messages de la base de données si tous les récepteurs l'ont supprimé, vous pouvez configurer un cronjob ou quelque chose. 2) avoir un creator_id dans le modèle de messages au lieu d'une table de créateurs, je veux dire comment plusieurs personnes peuvent-elles créer le même message?

3) Je ne comprends pas vraiment celui-ci, je suppose que vous définissez le drapeau "read" sur la table de récepteurs à "vrai" lorsque cet utilisateur ouvre le message, après cela vous pouvez faire une portée dans les utilisateurs modèle comme "scope: read, where (: read, true)" et aussi une portée non lue.

J'espère que c'est ce que vous voulez dire.

+0

1) il n'y aura qu'un seul récepteur, mais le message ne peut être supprimé que dès que les deux ont décidé de le supprimer 2) c'est vrai au moins pour la première approche 3) ouais je mets le readflag, mais comment puis-je informer le créateur que le message est lu? – Jan

Questions connexes