很可能一个良好的关系型数据库和面向对象设计是拥有一个主要的文章模型,它可能会与所有类型的文章共享大部分相同的属性和行为。这甚至可以作为您的“文本”类型文章。
这也可以简化与帖子的关系(例如:“用户有许多帖子”与“用户有许多文本帖子和/或视频帖子和/或等等”)。
然后有一种“附件”连接表,确定附件的类型(因此您可以为每个帖子添加多个附件)。
CREATE TABLE attachments (post_id, media_type, media_id)
然后为每种类型的特定行为和媒体类型的处理程序创建表格和模型。
CREATE TABLE audios (id, transcription, storage);
CREATE TABLE videos (id, location, format, storage);
这可能需要某种多态关系,尽管这可能会引起对数据库设计的争议...你需要视图和触发器来轻松查询和维护完整性...但Rails可以很好地处理它。
post模型应该具有:
has_many :attachments
附件将会
belongs_to :post
belongs_to :media, :polymorphic => true
每个媒体模型都会有自己的特点。
has_one :attachment, :as => :media
然后您可以通过以下方式访问您的媒体:
post.attachments[0].media
如果您只需要每篇文章一种类型的媒体,可以跳过附件表并将属性与帖子表合并。抱歉我一直在编辑,我一直在想要说的更多的事情 :)