Вероятно, хорошая реляционная база данных и объектно-ориентированный дизайн будут иметь одну основную модель поста, которая, вероятно, будет иметь в основном одинаковые атрибуты и поведение со всеми типами постов. Это может даже выступать в качестве ваших текстовых сообщений.
Это также может упростить отношения с сообщениями (например, «пользователи имеют много сообщений» против «пользователи имеют много текстовых сообщений и / или видео сообщений и / или т. Д.»).
Затем создайте таблицу соединений «вложения», которая определяет тип вложения (поэтому вы можете иметь несколько вложений на одно сообщение):
CREATE TABLE attachments (post_id, media_type, media_id)
Затем создайте таблицу и модель для каждого типа для конкретных моделей поведения и обработчиков для типов носителей.
CREATE TABLE audios (id, transcription, storage);
CREATE TABLE videos (id, location, format, storage);
Это, вероятно, потребует некоторого рода полиморфных отношений, хотя это может быть дискуссионный дизайн БД ... вам потребуются представления и триггеры для простого запроса и поддержания целостности ... но Rails справляется с этим довольно хорошо.
Почтовая модель будет иметь
has_many :attachments
и вложения будут иметь
belongs_to :post
belongs_to :media, :polymorphic => true
и каждая из медиа-моделей будет иметь
has_one :attachment, :as => :media
тогда вы можете получить доступ к вашим медиа через
post.attachments[0].media
Вы можете пропустить таблицу вложений и объединить атрибуты с таблицей сообщений, если вам нужен только один тип мультимедиа на сообщение
Извините, я продолжаю редактировать, я продолжаю думать о других вещах, чтобы сказать:)