В моем контроллере AssignmentsController есть метод batch_create, который позволяет специалистам по назначению назначать задания нескольким учащимся одновременно. Это сохраняет assignment_id в поле очереди каждого студента. assignment_id сериализуется как JSON и сохраняется как массив в поле очереди для каждого студента.

Моя проблема заключается в том, что в настоящее время при использовании batch_create для массового назначения заданий студенты в конечном итоге имеют одинаковые assignment_ids в своих очередях. Мне нужно назначить только 1 assignment_id очереди каждого студента на метод batch_create, а не все assignment_ids.

Назначения, по сути, являются экземплярами Activity, созданными AssignmentsController.

Пример запуска batch_create для одновременного назначения одного действия двум студентам приведет к появлению следующих двух assignment_id: 2316 и 2317.

В двух полях очереди учеников результат будет включать 2316 и 2317 для обоих пользователей. Я хочу, чтобы 2316 было в очереди одного пользователя и 2317 было в очереди другого пользователя, а не оба.

# app/controllers/assignments_controller.rb

  def batch_create
    # Make sure current user (teacher) is assigner if not set by admin.
    if params[:assignment][:assigner_id].present?
      assigner_id = params[:assignment][:assigner_id]
    else
      assigner_id = current_user.id
    end

    activities = params[:assignment][:activity_ids].nil? ? []
                  : params[:assignment][:activity_ids].split(",").map { |s| s.to_i }

    students = params[:assignment][:student_ids].nil? ? []
                  : params[:assignment][:student_ids].split(",").map { |s| s.to_i }

    assignments = []
    activities.each do |activity_id|
      students.each do |student_id|
        assignments << {
          activity_id: activity_id,
          assignee_id: student_id
        }
      end
    end

    @assignments = Assignment.create(assignments) do |a|
      a.assigner_id = assigner_id
      a.assessment = params[:assignment][:assessment]
    end

    respond_to do |format|
      if @assignments.present?
        # Add assignment(s) to the student's queue
        @assignments.each do |assignment|
          students.each do |student_id|
            @student = User.find(student_id)
            @student.queue_will_change!
            @student.queue << assignment.id
            @student.save!
          end
        end

        format.html { redirect_to assignments_path, notice: 'Assignments were successfully created.' }
      else
        format.html { render action: 'new' }
      end
    end
  end
0
gnycl 26 Фев 2016 в 18:57

2 ответа

Лучший ответ

В итоге я просто захватил пользователя уникальным образом, изменив одну строку в этом блоке:

# Add assignment(s) to the student's queue
@assignments.each do |assignment|
    @student = User.find(assignment.assignee_id)
    @student.queue_will_change!
    @student.queue << assignment.id
    @student.save!
end
0
gnycl 26 Фев 2016 в 21:02

Может быть, вы можете попробовать это:

@assignments.each do |assignment|
  students.each do |student_id|
    @student = User.find(student_id)
    @student.queue_will_change!
    @student.queue << assignment.id unless @student.queue.include? assignment.id
    @student.save!
  end
end

Это должно сработать.

0
tanvir2362 26 Фев 2016 в 18:41