在Rails 4中使用嵌套循环一次创建多个对象

时间:2016-02-26 15:57:27

标签: ruby-on-rails ruby

我的AssignmentsController中有一个batch_create方法,允许分配者一次为多个学生分配作业。这会将assignment_id保存到每个学生的队列字段中。 assignment_id被序列化为JSON,并作为数组存储在每个学生的队列字段中。

我的问题是,目前使用batch_create批量分配作业时,学生最终会在队列中使用相同的assignment_ids。我需要为每个batch_create方法只为每个学生的队列分配1个assignment_id,而不是所有的assignment_ids。

作业本质上是由AssignmentsController生成的活动的实例。

运行batch_create以同时为两名学生分配1个活动的示例将生成以下两个assignment_ids: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

2 个答案:

答案 0 :(得分:0)

可能你可以试试这个:

@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

应该这样做。

答案 1 :(得分:0)

我最后通过修改该块中的一行来唯一地抓取用户:

# 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