【问题标题】:db design: general comments, several types of postsdb design:一般评论,几种类型的帖子
【发布时间】:2011-05-18 22:52:03
【问题描述】:

我有几个表格,例如:文章、想法和页面,我希望能够为每个表格添加 cmets。 我应该为每个表添加 cmets 表(articles_cmets,pages_cmets ...)还是以某种方式为各种数据创建通用 cmets 表(如果可以,请扩展如何在 rails 中实现它)

我有一个想法来做 cmets 表,其中包含

[评论] ID、型号、MODEL_ID、 USER_ID,文本

虽然模型包含目标表(文章/帖子...),而model_id是表中的外国ID,这是一个好的解决方案吗? 问题是我不知道如何在 Rails 中实现这样的模型。

我也想知道 Facebook 如何实现他们的帖子数据库。 fb 用户可以发布任何类型的数据(问题/状态/民意调查/图片),它正好适合当前订单和 cmets 的提要表。

【问题讨论】:

    标签: ruby-on-rails database ruby-on-rails-3 database-design


    【解决方案1】:

    创建一个通用的Comment 模型并使其具有如下多态性:

    class Comment < ActiveRecord::Base
      belongs_to :commentable, :polymorphic => true
    end
    
    class Article < ActiveRecord::Base
      has_many :comments, :as => :commentable
    end
    
    class Thought < ActiveRecord::Base
      has_many :comments, :as => :commentable
    end
    

    从 Article 模型的实例中,您可以检索 cmets 的集合:@article.comments

    如果您有Comment 模型的实例,您可以通过@comment.commentable 访问其父模型

    要实现这一点,您需要在声明多态接口的模型中同时声明外键列和类型列:

    class CreateComments < ActiveRecord::Migration
      def self.up
        create_table :comments do |t|
          t.text       :content
          t.references :user
          t.references :commentable, :polymorphic => true
          t.timestamps
        end
      end
    
      def self.down
        drop_table :comments
      end
    end
    

    【讨论】:

      【解决方案2】:

      我怀疑“文章”、“想法”和“页面”的相似之处多于不相似之处,也许应该放在一个表中。然后这个问题就消失了。

      【讨论】:

      • 这只是一个例子,真实的桌子是不一样的
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-11-29
      • 1970-01-01
      • 1970-01-01
      • 2022-09-30
      • 1970-01-01
      • 2013-04-01
      相关资源
      最近更新 更多