У меня есть платформа школьных работ, которая позволяет: - пользователям создавать домашнее задание (Work
) или викторину (Work
с Questions
) - пользователям отправлять задания (Submission
)
Данное задание или work
, может иметь много submissions
.A work
также может иметь множество questions
.question
может иметь множество answers
, либо каноническое answers
(заданное учителем), либо неканоническое answers
(предоставленное учениками).
Когда ученик отправляет задание (создаетSubmission
для данного Work
), они должны видеть вопросы, относящиеся к работе, и уметь создавать неканонические answers
.Студент не должен иметь возможности изменять какие-либо атрибуты question
.
Проблема : Я думаю об использовании вложенной формы для моделирования описанного выше поведения, но у меня возникли некоторые проблемы с заполнением правильных полей.Мне нужно иметь возможность соотнести ответ с представлением, из которого он получен.Однако в данный момент я отправляю форму и звоню Submission.new
/ Submission.create
, отправка еще не имеет идентификатора, и поэтому я не могу заполнить answers_attribute
submission_id
.
Вопрос :
- Как исправить вложенную форму для правильного заполнения
submission_id
для ответа? - Есть ли другой способЯ могу сделать это, чтобы выполнить то же самое?
- Есть ли более простой способ конструировать отношения, чем у меня сейчас?
Код
class Work < ApplicationRecord
has_many :submissions
has_many :questions # Allow for quizzes
has_many :answers, through: :questions
accepts_nested_attributes_for :questions, reject_if: :all_blank, allow_destroy: true
validates :name, presence: true, allow_nil: false
end
# == Schema Information
#
# Table name: works
#
# id :bigint(8) not null, primary key
# description :text
# due_date :datetime
# grades_published :boolean default(FALSE)
# name :string
# points :float default(1.0)
# published :boolean
# submittable :boolean default(TRUE)
# url :string
# created_at :datetime not null
# updated_at :datetime not null
# category_id :integer
# course_id :integer
#
class Submission < ApplicationRecord
belongs_to :work
belongs_to :enrollment
has_one :grade
has_many :questions, through: :works
has_many :answers, through: :questions
accepts_nested_attributes_for :questions, reject_if: :all_blank, allow_destroy: true
accepts_nested_attributes_for :answers, reject_if: :all_blank, allow_destroy: true
validates_uniqueness_of :work_id, scope: :enrollment_id, message: " has already been submitted"
end
# == Schema Information
#
# Table name: submissions
#
# id :bigint(8) not null, primary key
# enrollment_id :integer
# work_id :integer
# title :string
# content :text
# created_at :datetime not null
# updated_at :datetime not null
#
class Question < ApplicationRecord
belongs_to :work
has_many :answers, inverse_of: :question
accepts_nested_attributes_for :answers, reject_if: :all_blank, allow_destroy: true
validates :value, presence: true, allow_nil: false
end
# == Schema Information
#
# Table name: questions
#
# id :bigint(8) not null, primary key
# value :string
# created_at :datetime not null
# updated_at :datetime not null
# work_id :bigint(8)
#
# Indexes
#
# index_questions_on_work_id (work_id)
#
class Answer < ApplicationRecord
belongs_to :question, inverse_of: :answers
# belongs_to :work, through: :questions
# belongs_to :submission, through: :works
validates :question_id, :presence => true
validates :value, presence: true, allow_nil: false
end
# == Schema Information
#
# Table name: answers
#
# id :bigint(8) not null, primary key
# is_canon :boolean default(FALSE)
# is_correct :boolean default(FALSE)
# value :string
# created_at :datetime not null
# updated_at :datetime not null
# question_id :bigint(8)
# submission_id :bigint(8)
#
# Indexes
#
# index_answers_on_question_id (question_id)
# index_answers_on_submission_id (submission_id)
#
# Foreign Keys
#
# fk_rails_... (question_id => questions.id)
# fk_rails_... (submission_id => submissions.id)
#
Помощь очень ценится.Спасибо !!