我正在自学rails,并想建立一个类似tumblr的博客。它将有几种不同的帖子类型,如书面文本帖子、照片帖子、音频帖子和视频帖子。
我最初的想法是为每种类型的帖子建立不同的模型,因为每种类型的帖子都会有不同的规则。然而,我还在学习,不知道我不知道什么,所以也许有更好的方法去做事情(也许只有一个帖子模型,一个帖子类型表?)。
任何反馈都将不胜感激。
发布于 2011-07-15 01:35:22
也许一个好的关系数据库和面向对象的设计应该是拥有一个主帖子模型,它可能与所有类型的帖子共享大部分相同的属性和行为。这甚至可以作为你的“文本”类型的帖子。
这也可以简化与帖子的关系(例如。“用户有许多帖子”与“用户有许多文本帖子和/或视频帖子和/或等”)。
然后有一种" attachments“连接表,它决定了附件的类型(因此每个帖子可以有多个附件):
CREATE TABLE attachments (post_id, media_type, media_id)然后为每种类型建立一个表和模型,用于特定的行为和媒体类型的处理程序。
CREATE TABLE audios (id, transcription, storage);
CREATE TABLE videos (id, location, format, storage);不过,这可能需要某种多态关系,这可能是一个有争议的DB设计……您将需要视图和触发器来轻松查询和维护完整性……但是Rails可以很好地处理它。
post模型会有
has_many :attachments和附件会有
belongs_to :post
belongs_to :media, :polymorphic => true每种媒体模型都会有
has_one :attachment, :as => :media然后,您可以通过访问媒体
post.attachments[0].media如果每个帖子只需要一种类型的媒体,则可以跳过附件表并将属性与帖子表合并
对不起,我一直在编辑,我一直在想更多的事情要说:)
发布于 2011-07-15 01:39:10
这里有几个可行的选择。
首先,您可以只创建一个包含text_content、video_link、photo_link等列的模型。
然后,在您的视图中,您可以根据哪些属性具有值,以不同的外观向用户呈现帖子的视图(可能使用部分)。
第二种选择是制作一个更小的Post表,它只包含关键信息,并使用一系列与其他项的“has_one”关系。
我认为第二种方法的唯一优点是,您的DB表将更小,因为您不必一遍又一遍地表示空单元格。除非你担心一些巨大的伸缩性问题,否则我会选择第一个选项。
https://stackoverflow.com/questions/6697432
复制相似问题