Как передать родительский идентификатор во вложенный атрибут, если родительская модель еще не создана? - PullRequest
0 голосов
/ 04 июня 2019

У меня есть платформа школьных работ, которая позволяет: - пользователям создавать домашнее задание (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.

Вопрос :

  1. Как исправить вложенную форму для правильного заполнения submission_id для ответа?
  2. Есть ли другой способЯ могу сделать это, чтобы выполнить то же самое?
  3. Есть ли более простой способ конструировать отношения, чем у меня сейчас?

Код

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)
#

Помощь очень ценится.Спасибо !!

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