同时将多态关系映射到2个模型

时间:2009-11-11 20:53:28

标签: ruby-on-rails comments polymorphism

我需要同时将一个评论模型与两个ID相关联,但无法弄清楚如何。这是'我的情况。我正在建立一个on-line school grading system,并且需要能够让老师在特定学期(评分期)的特定课程中对某个学生发表评论。

class Course
  has_many :course_terms
  has_many :enrollments
end

class CourseTerm
  belongs_to :course
end

class Student
  has_many :enrollments
  has_many :courses, :through => :enrollments
end

class Enrollment < ActiveRecord::Base
  belongs_to :student
  belongs_to :course
end

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

我知道它看起来非常复杂,但它非常简单。一门课程有许多学生可以注册的术语。我想对CourseTerm +学生发表评论,但我不知道Polymorphic是否可以在一个评论中处理多个ID。我可以这样做:

class CourseTerm
  has_many :comments, :as => :commentable, :source => [:student, :course_term]
end

或者我是否必须放弃Polymorphics并使用带有CourseTerm.id和Student.id的标准Comment表构建?

1 个答案:

答案 0 :(得分:1)

不,您将无法使用多态关系创建所需的映射。多态关系背后的想法是允许模型使用单个外键属于其他几个模型之一,并添加一个额外的列,指示每行引用的模型。对于评论,该表看起来像:

CREATE TABLE comments (
    id                integer primary key,
    commentable_id    integer,
    commentable_type  varchar(255),
    text              text
);

但是,由于您希望将评论与用户和课程术语相关联,因此单个外键是不够的,因此您必须使用属于用户和课程术语的标准模型:

class Comment < ActiveRecord::Base
  belongs_to :user
  belongs_to :course_term
end