关于与许多其他类型的关系相关联的关系的最佳实践的意见

时间:2015-04-19 20:30:42

标签: sql ruby-on-rails ruby relation

我有一个Rails数据库,用于审查学校的事情。我的表是学校,专业,课程,讲师,评论。我的团队目前设置了Review表的方式,每个其他表都有不可为空的外键。

我的问题是,要提交新评论,用户只想填写其中一个外键。有没有办法用Rails做到这一点?即使有,看起来这对于Instructor_Review,Course_Review等表是一个更好的用例。这也有一个(非常好的)好处,可以为每个评论自定义表属性。

但是,如果我们要将Review分解为多个表,那么Rails中是否有一个具有公共列的机制?如果属性只是具有相同的名称,或者Rails有一种方法可以使用表子类(我知道SQL中有...),则需要为每种类型的审阅都包含overall_rating属性。

2 个答案:

答案 0 :(得分:1)

如果它们相似,我不会为不同的评论类型创建不同的模型(除了评论的内容之外)。这可能是should be avoided的重复来源。

相反,您可以使用polymorphic association。您的评论模型有一个评论所属的内容(无论是学校,教师还是教师)。所以我们就这样建模吧。给它引用那个东西和那个东西的类型(以便Rails知道它属于哪个类)。

通过多态关联,您的类可以像这样链接:

class Review < ActiveRecord::Base
  belongs_to :reviewable, polymorphic: true
  belongs_to :user
  # ...
end

class School < ActiveRecord::Base
  has_many :reviews, as: :reviewable
end

class Teacher < ActiveRecord::Base
  has_many :reviews, as: :reviewable
end

在数据库级别,这意味着您的审核表只需要一个外键指向reviewable内容(加上一个类型列)。审核迁移将如下所示:

class CreateReviews < ActiveRecord::Migration
  def change
    create_table :reviews do |t|
      t.references :user, index: true
      t.references :reviewable, polymorphic: true, index: true, null: false
      t.timestamps null: false
    end
  end
end

polymorphic: true让Rails创建id-和type-column。 有关详细信息,请参阅ActiveRecord documentation

PS:还有a RailsCast covering this issue。但要注意:它来自2009年 - 相当古老,但(从快速一瞥)它应该仍然有效。

答案 1 :(得分:1)

您正在寻找多元关系。基本上在评论中添加一个类型列,然后你必须正确连接它。这是一篇很棒的文章。

http://www.gotealeaf.com/blog/understanding-polymorphic-associations-in-rails

然后,审核表将包含您要共享的常用可审核列。下一部分有点复杂。然后,您将设置审核以获得扩展。

要解释扩展名,通常在您拥有可以是组或用户的实体时执行此操作(类似于您的InstructoreReview和CourseReview的评论类型)。这些组/用户将具有与评论的扩展类似的简档。

ReviewExtension将为每个评论提供自己的表格,并且大多数情况下,这些扩展位于模型下的自己的review_extensions文件夹中。

完成后,您将委托您想要扩展的常用getter和setter方法。

希望这至少会让你足够开始。