Une bonne base de données relationnelle et une bonne conception orientée objet consisteraient à avoir un modèle de message principal, qui partagerait probablement les mêmes attributs et comportements avec tous les types de messages. Il pourrait même servir de modèle pour vos messages de type "texte".
Cela pourrait également simplifier les relations avec les messages (par exemple, "les utilisateurs ont beaucoup de messages" par rapport à "les utilisateurs ont beaucoup de messages de texte et/ou de messages vidéo et/ou etc.)
Ensuite, vous disposez d'une sorte de table de jonction "pièces jointes", qui détermine le type de pièce jointe (afin que vous puissiez avoir plusieurs pièces jointes par message) :
CREATE TABLE attachments (post_id, media_type, media_id)
Ensuite, il y a une table et un modèle pour chaque type de média, avec des comportements spécifiques et des gestionnaires pour les types de médias.
CREATE TABLE audios (id, transcription, storage);
CREATE TABLE videos (id, location, format, storage);
Cela nécessitera probablement une sorte de relation polymorphe, ce qui pourrait être une conception de base de données discutable... vous aurez besoin de vues et de déclencheurs pour interroger facilement et maintenir l'intégrité... mais Rails le gère très bien.
Le modèle de poste aurait
has_many :attachments
et les pièces jointes auraient
belongs_to :post
belongs_to :media, :polymorphic => true
et chacun des modèles de médias aurait
has_one :attachment, :as => :media
alors vous pouvez accéder à vos médias via
post.attachments[0].media
Vous pouvez ignorer la table des pièces jointes et fusionner les attributs avec la table des messages si vous n'avez besoin que d'un seul type de média par message.
Désolé, je continue à éditer, je pense toujours à d'autres choses à dire :)