什么是可以附加到不同类型的父模型的子模型的正确关联?

时间:2013-07-21 12:11:22

标签: sql ruby-on-rails ruby oop

我正在使用Rails,虽然这适用于任何OO / SQL系统,实际上。

我有一个Note模型和一个Comment模型。备注可以有很多评论。这很简单,但现在我想添加一个新的模型,LearningObjective,它也可以有很多评论。这样做的正确方法是什么?我唯一能想到的是在Comments表中有一个列,其中包含父模型的名称和parent_model_id列。否则,我必须在Comments表中有两个单独的列,一个用于note_id,另一个用于learning_objective_id,其中一个是空的。

这种情况是否有典型的模式?也许是一个中间模型?

2 个答案:

答案 0 :(得分:0)

您可以使用交叉表:

    +---------------------+
    | Comments            |
    +---------------------+
    | commentID | comment |
    +---------------------+

    +---------------+
    | Notes         |
    +---------------+
    | noteID | note |
    +---------------+

    +-------------------------+
    | LearningObjective       |
    +-------------------------+
    | objectiveID | objective |
    +-------------------------+

现在为你的十字路口:

    +------------------------------------+
    | NoteComment                        |
    +------------------------------------+
    | noteCommentID | commentID | noteID |
    +------------------------------------+

    +------------------------------------------------------+
    | LearningObjectiveComment                             |
    +------------------------------------------------------+
    | learningObjectiveCommentID | commentID | objectiveID |
    +------------------------------------------------------+

我就是这样做的,确定还有其他解决方案

答案 1 :(得分:0)

您描述的场景通常是通过多态来解决的,这基本上就是您在问题中理论化的内容。 Rails中的多态性为easy;一个例子:

class Comment < ActiveRecord::Base
  belongs_to :commentable, polymorphic: true
end

class Note < ActiveRecord::Base
  has_many :comments, as: :commentable
end

class LearningObjective < ActiveRecord::Base
  has_many :comments, as: :commentable
end

您的comments表中有两列用于处理此关系:commentable_typecommentable_id,它们将分别存储关联的类名和ID。