2009-11-11 4 views
0

Мне нужно связать модель комментариев с двумя идентификаторами одновременно, но не могу понять, как это сделать. Вот моя ситуация. Я создаю on-line school grading system и должен уметь преподавать комментарий к конкретному учащемуся в конкретном курсе на определенный срок (период оценки).Отображение полиморфного отношения на 2 модели одновременно

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 

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

ответ

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 
+0

Darn вы и ваша логика. :) Я надеялся, что у Rails может быть еще * волшебство * в его сумке, чтобы все это просто работало. О, хорошо, похоже, я должен сделать это тяжело. Thanx за помощь! –

Смежные вопросы