2016-09-02 5 views
0

これは、モデルを試して更新するときに特に頻繁に発生します。私のモデルの属性が順番どおりに保存されないのはなぜですか?

Iクイズアプリケーションを持っており、私はこのフォームを使用してクイズを追加:

<%= form_for(@quiz) do |f| %> 
    <% if @quiz.errors.any? %> 
    <div id="error_explanation"> 
     <h2><%= pluralize(@quiz.errors.count, "error") %> prohibited this quiz from being saved:</h2> 

     <ul> 
     <% @quiz.errors.full_messages.each do |message| %> 
     <li><%= message %></li> 
     <% end %> 
     </ul> 
    </div> 
    <% end %> 
    <div class="field"> 
    <%= f.label :name %><br> 
    <%= f.text_field :name %> 


    </div> 
<div class = 'field'> 
    <%= f.label :difficulty, "Difficulty of Quiz, 1 to 3 with 3 being most difficult" %> 
    <%= f.text_field :difficulty %> 

</div> 
    <div class="field"> 
    <%= f.label :for_unsubscribed, "Check to have this quiz be visible to logged in but unsubscribed users" %> 
    <%= f.check_box :for_unsubscribed %> 


    </div> 
    <%= f.fields_for :questions do |question_attribute| %> 
    <div class = 'inner-c'> 
    <p> 
    <%= question_attribute.label :content, "Question" %> <span><b><%= question_attribute.index + 1 %></b></span> <br/> 
    <%= question_attribute.text_area :content, :cols => 100, :rows => 4 %> 
    </p> 
    <p> 
    <%= question_attribute.label :explanation, "Answer Explanation" %> <br/> 
    <%= question_attribute.text_area :explanation, :cols => 100, :rows => 6 %> 

</p> 
    <%= question_attribute.label :_destroy, "Remove Question"%> 
    <%= question_attribute.check_box :_destroy %><br/> 

    <%= question_attribute.label :passage, "Reference Passage" %> <br/> 
    <%= question_attribute.text_area :passage, :rows => 3, :class => 'passage-input' %> 


    <%#= question_attribute.label :question_explanation, "Question Explanation" %> 
    <%#= question_attribute.text_area :question_explanation, :rows => 10 %> 


    </p> 

    <%= question_attribute.fields_for :answers do |answer_attribute| %> 
    <p> 
     <%= answer_attribute.label :content, "Answer" %> 
     <%= answer_attribute.text_field :content %> 
     <%= answer_attribute.label :correct_answer, "Check to indicate correct answer", :class => 'inline' %> 
     <%= answer_attribute.check_box :correct_answer, :class => 'inline'%> 

    </p> 
    <% end %> 

    </div> <!-- inner-c --> 
<% end %> 


    <div class="actions"> 
    <%= f.submit %> 
    </div> 
<% end %> 

新しいフォームはそうのようなコントローラによって生成される:

ネストされた使用を活かし
def new 
    @quiz = Quiz.new 
    50.times do 
    question = @quiz.questions.build 
    5.times { question.answers.build } 
    end 
    end 

モデル、どこでクイズhas_many質問has_many答えます。

問題は - 私がクイズを(50個の質問で)作成すると、その後、クイズを試してからアップデートして、間違いを修正します。質問は順不同です。質問43と質問1が場所を切り替える可能性があります。私はそれらを更新した後に同じ順序で留まるために絶対に質問が必要ですが、私はこれをどうやって行うのか理解できません。何か案は?

答えて

0

通常、RDBMSでは、明示的に指定しない限り、デフォルトでは順序は指定されません。したがって、注文を指定しなかった場合は、期待どおりの結果が得られます。

あなたの説明によると、質問43は更新後に質問1と入れ替えられたので、updated_atタイムスタンプで注文していると思います。 id - idで質問を明示的に発注しようとすると、[通常は]プライマリキーであり、変更されることはありません。

+0

さらに進んで、レコードの作成順にIDが生成されるとは想定しません。アプリに順序付けされた質問が明示的に要求されている場合は、明示的にモデル化する必要があります(質問の場合は「ordinal」属性を使用します)。 –

+0

ありがとう、それはいくつかを解明しました。しかし、 'updated_at'タイムスタンプを使って注文しているかどうかはどうすれば分かりますか?私が質問を表示するとき、私は単に 'questions.each do | question |'のようなことをしています。 それを明示的にモデル化する方法を説明できますか?私はまだレールにはまだ新しいです! – nachime

関連する問題