RoR — почему я сохраняю дубликаты записей?

#ruby-on-rails #ruby #activerecord #many-to-many #duplicates

#ruby-on-rails #ruby #activerecord #многие ко многим #дубликаты

Вопрос:

У меня настроено отношение «многие ко многим» с помощью quizzes, quiz_questions и quiz_questions_links. У меня была форма для создания теста и добавления в него существующих вопросов, которая отлично работала. Теперь мне нужно разрешить пользователям добавлять новые вопросы вручную. Но моя форма теперь пытается вставить две записи в таблицу quiz_questions_links для каждого вводимого вручную вопроса, и я не могу понять почему. Вот пример публикации из формы:

 Parameters: {
  "commit"=>"Create", 
  "quiz"=>{
    "keyword_list"=>"", 
    "quiz_questions_links_attributes"=>{
       "1"=>{ "sequence"=>"1", "quiz_question_id"=>"2" }, 
       "2"=>{ "sequence"=>"2", "quiz_question_id"=>"9" }
    }, 
    "quiz_questions_attributes"=>{
      "1"=>{
        "answers_attributes"=>{
          "0"=>{
            "content"=>"Manual Question Answer 2"}}, 
        "correct_answer_attributes"=>{
          "content"=>"Manual Question Answer 1", 
          "correct_answer"=>"1"}, 
        "content"=>"Manual Question"}
    "opening_blurb"=>"test"
    etc...
  

Итак, тест отправляется с атрибутами для quiz_question (который является вопросом, введенным вручную) и атрибутами для quiz_questions_links (которые являются существующими вопросами, прикрепленными к этому тесту). Надеюсь, это имеет смысл. Ключевые части моего контроллера викторины выглядят следующим образом:

 if @quiz.save
  flash[:notice] = 'Quiz was successfully created.'
  redirect_to([:cms, @quiz])
end
  

Это правильно создает любые новые quiz_questions с их ответами. Затем он корректно вставляет записи quiz_questions_links для существующих вопросов, добавленных в тест, и новых quiz_questions, созданных вручную. Но затем он пытается вставить дубликаты записей для созданных вручную quiz_questions. Я не могу понять, почему он вставляет дубликаты записей. Есть мысли?

РЕДАКТИРОВАТЬ: удален цикл вопросов в контроллере, поскольку он не был нужен, добавлены соответствующие части каждой модели ниже.

 #quiz.rb
has_many :quiz_questions_links, :dependent => :destroy
has_many :quiz_questions, :through => :quiz_questions_links, :uniq => true
accepts_nested_attributes_for :quiz_questions
accepts_nested_attributes_for :quiz_questions_links

#quiz_question.rb
has_many :quiz_questions_links
has_many :quizzes, :through => :quiz_questions_links

#quiz_questions_links.rb
belongs_to :quiz
belongs_to :quiz_question
  

Ответ №1:

Используете ли вы accepts_nested_attributes_for:quiz_questions в своей модели викторины? Вам не нужно перебирать вопросы викторины и сохранять каждый из них в контроллере, если это так. Попробуйте это и посмотрите, решит ли это вашу проблему.

Комментарии:

1. Я использую это, поэтому я удалил цикл вопросов. Я получаю ту же проблему. Из журнала теперь сначала вставляется quiz, затем quiz_questions_links для существующих вопросов. Затем он вставляет quiz_question и ответы, затем дважды пытается создать для него ссылку. Я отредактирую свой вопрос, чтобы отразить изменения в моем коде и добавить соответствующие части каждой модели. Спасибо, что взглянули!

Ответ №2:

Я не смог получить ответ на этот вопрос. Вместо этого я буду использовать всплывающую форму для добавления нового вопроса.