Ruby on rails RoR-为什么要保存重复记录?

Ruby on rails RoR-为什么要保存重复记录?,ruby-on-rails,ruby,activerecord,many-to-many,duplicates,Ruby On Rails,Ruby,Activerecord,Many To Many,Duplicates,我与测验、测验问题和测验问题链接建立了多对多关系。我有一个表格来创建一个测验,并将现有的问题添加到其中,效果很好。现在我需要让用户手动添加新问题。但是我的表单现在正试图为每个手工输入的问题在quick\u questions\u links表中插入两条记录,我不知道为什么。以下是表格中的示例张贴: Parameters: { "commit"=>"Create", "quiz"=>{ "keyword_list"=>"", "quiz_questio

我与测验、测验问题和测验问题链接建立了多对多关系。我有一个表格来创建一个测验,并将现有的问题添加到其中,效果很好。现在我需要让用户手动添加新问题。但是我的表单现在正试图为每个手工输入的问题在quick\u questions\u 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...
因此,将提交一个测验,其中包含测验问题的属性(即手动输入的问题)和测验问题链接的属性(即附加到此测验的现有问题)。希望这是有道理的。我的测验控制器的关键部分如下所示:

if @quiz.save
  flash[:notice] = 'Quiz was successfully created.'
  redirect_to([:cms, @quiz])
end
这会正确地创建任何新的问答题及其答案。然后,它会正确插入添加到测验中的现有问题和新手动创建的测验问题的测验问题链接记录。但是,它会尝试为手动创建的问答题插入重复记录。我不明白为什么要插入重复记录。有什么想法吗

编辑:删除控制器中不需要的问题循环,在下面添加每个模型的相关部分。

#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

您是否在您的测验模型中使用accepts_nested_attributes_用于:测验问题?如果是这样的话,你不应该循环测试问题并将每个问题保存在控制器中。试试看,看它是否能解决你的问题。

我还没能回答这个问题。相反,我将使用一个弹出表单添加一个新问题。

我正在使用该表单,因此我删除了问题循环。我也有同样的问题。从日志中,它首先插入测验,然后插入现有问题的测验问题链接。然后插入测验问题和答案,然后尝试为其创建两次链接。我将编辑我的问题以反映我的代码更改,并添加每个模型的相关部分。谢谢你看!