Отображение полиморфных отношений на 2 модели одновременно - PullRequest
0 голосов
/ 11 ноября 2009

Мне нужно связать модель комментариев с двумя идентификаторами одновременно, но я не могу понять, как это сделать. Вот моя ситуация. Я создаю онлайновую систему аттестации , и мне нужно, чтобы учитель мог прокомментировать конкретного ученика в конкретном курсе за определенный семестр (период аттестации).

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 + Student, но я не знаю, может ли Polymorphic обрабатывать несколько идентификаторов в одном комментарии. Могу ли я сделать что-то вроде этого:

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

Или я должен отказаться от Полиморфизма и пойти со стандартной сборкой таблицы комментариев с CourseTerm.id и Student.id?

1 Ответ

1 голос
/ 12 ноября 2009

Нет, вы не сможете создать желаемое отображение, используя полиморфные отношения. Идея, лежащая в основе полиморфных отношений, состоит в том, чтобы позволить модели принадлежать одной из нескольких других моделей, использующих один внешний ключ, с добавлением дополнительного столбца, который указывает модель, к которой относится каждая строка. Для комментариев таблица будет выглядеть примерно так:

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
...