Rails - Как настроить модель, которая может принадлежать любой из 3 разных моделей - PullRequest
2 голосов
/ 17 августа 2010

Я пытаюсь создать приложение, которое делает тестирование похожим на то, что вы испытали бы в школе.

У меня есть модельный Вопрос, который может принадлежать к экзамену, викторине или заданию.

Должен ли я создавать поля для ": exam_id,: integer,: null => false;: quiz_id,: integer,: null => false;: assignment_id,: integer,: null => false;"?

Вопрос будет принадлежать одному или нескольким или всем из них (поэтому я могу использовать один и тот же вопрос в различных моделях).

Должен ли я удалить: null => false, чтобыможет принадлежать кому-либо из них .... или как лучше это настроить?

Ответы [ 2 ]

5 голосов
/ 17 августа 2010

Звучит так, как будто вы хотите здесь использовать полиморфные отношения. Вам нужно общее имя для экзамена / викторины / задания, и каждый вопрос будет принадлежать одному из них. Скажем, вы называете их оценками, вы бы настроили свои модели так:

class Question << ActiveRecord::Base
  belongs_to :assessment, :polymorphic => true
end

class Exam << ActiveRecord::Base
  has_many :questions, :as => :assessment
end

class Quiz << ActiveRecord::Base
  has_many :questions, :as => :assessment
end

class Assignment << ActiveRecord::Base
  has_many :questions, :as => :assessment
end

Затем вам нужно будет добавить два поля в модель вопроса:

assessment_id
assessment_type

С этими отношениями вы можете использовать его как:

@exam = Exam.create({:field1 => :val1})    
@exam.questions.create({:field1 => :question1})
@exam.questions.create({:field1 => :question2})

и он будет точно знать, какие вопросы принадлежат к какой модели, на основе дополнительных полей в вашей модели вопросов.

0 голосов
/ 17 августа 2010

Я бы, вероятно, создал таблицу поиска для каждого отношения, поэтому у вас будет таблица exam_questions, quiz_questions и homework_questions.

Каждый из них будет содержать идентификатор владельца (например, exam_id) и вопрос (question_id).

Таким образом, если вопрос принадлежит только одному или двум из трех, вы можете просто создать строки для этих отношений. Это также упрощает добавление новых отношений, если вы вводите новый тип владельца, например studyguide или что-то в этом роде.

Вы бы оставили :null => false в этом методе, поскольку отношения либо будут существовать, либо не будут.

...