0

251問の大規模な心理テストがあります。各ユーザーは、そのテストを何度も完了することができます。そこで、各完了を表すサマリー モデルを作成しました。各サマリーには多くの回答があります。要約ごとに、Slim templater と simple_form gem を使用して、回答のコレクションを表すフォームを作成しました。

= simple_form_for(@summary) do |f|
  = f.simple_fields_for :answers do |a|
    .question
      = a.input :question_id, as: :hidden
      div= a.object.question.title
      - if a.object.question.kind_of? SpiritualityQuestion
        ol class="sortable"
          - a.object.question.sortable_variants.each do |sortable_variant|
            = content_tag_for :li, sortable_variant
              = sortable_variant.title
        = a.input :text_data, as: :hidden, input_html: { class: 'sortable_data' }
      - elsif a.object.question.kind_of? MultilineQuestion
        div Time remaining: <span class="time">60</span> s.
        = button_tag 'Start', type: 'button', class: 'start_button btn btn-primary'
        = a.input :text_data, label: false, input_html: { class: 'span8 timed_text', cols: '60', rows: '20', disabled: true }
      - else
        = a.association :variant, collection: a.object.question.variants, as: :radio, label: false
    br
  = f.input :user_id, as: :hidden
  = f.input :psy_test_id, as: :hidden

  .actions
    = f.button :submit, value: 'Save', class: 'btn btn-large btn-success'

そして、関連するコントローラーアクションがあります:

@summary = Summary.where(completed: false, user: current_user, psy_test: PsyTest.first)
                  .includes(:answers => { :question => :variants })
                  .first_or_initialize
@summary.build_answers if @summary.new_record?

Summary.build_answers:

def build_answers
  # Creating answers for questions
  psy_test.questions.includes(:variants).each do |q|
    answers.new(question: q)
  end
end

テストが非常に大きく、フォームの生成が非常に遅いため、テストをページ分割しようとしています。したがって、回答に制限とオフセットを追加したいと思います。そんな感じ:

= f.simple_fields_for answers.limit(@limit).offset(@offset) do |a|

どのように作ることができますか?

4

1 に答える 1