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

Ruby on rails 在Rails 4中使用嵌套循环一次创建多个对象,ruby-on-rails,ruby,Ruby On Rails,Ruby,我的作业控制器中有一个batch\u create方法,允许作业人员一次将作业分配给多个学生。这会将作业id保存到每个学生的队列字段中assignment_id被序列化为JSON,并作为数组存储在每个学生的队列字段中 我的问题是,目前在使用batch\u create批量分配作业时,学生的队列中的作业ID是相同的。每个批处理创建方法只需为每个学生的队列分配一个作业id,而不是所有作业id 分配本质上是由AssignmentsController生成的活动的实例 batch_create的一个示例

我的作业控制器中有一个
batch\u create
方法,允许作业人员一次将作业分配给多个学生。这会将
作业id
保存到每个学生的队列字段中
assignment_id
被序列化为JSON,并作为数组存储在每个学生的队列字段中

我的问题是,目前在使用
batch\u create
批量分配作业时,学生的队列中的作业ID是相同的。每个批处理创建方法只需为每个学生的队列分配一个作业id,而不是所有作业id

分配本质上是由AssignmentsController生成的活动的实例

batch_create的一个示例运行将一个活动同时分配给两个学生,将生成以下两个分配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
#app/controllers/assignments_controller.rb
def批处理创建
#确保当前用户(教师)不是管理员设置的指派者。
如果参数[:assignment][:assigner\u id]。是否存在?
assigner_id=参数[:assignment][:assigner_id]
其他的
assigner_id=当前_user.id
结束
活动=参数[:分配][:活动\u ID].nil?[]
:params[:assignment][:activity_id].split(“,”).map{s|s.to_i}
学生=参数[:作业][:学生ID].nil?[]
:params[:赋值][:学生ID].split(“,”).map{s|s.to_i}
分配=[]
活动。每个do |活动id|
学生。每个人都有学生id|

作业可能有问题,您可以尝试以下方法:

@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
@assignments.each do| assignment|
学生。每个人都有学生id|
@学生=用户。查找(学生id)
@学生队列将改变!

@student.queue我通过修改该块中的一行来唯一地抓取用户:

# 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
#将作业添加到学生队列
@作业。每项作业|
@student=User.find(assignment.assignment\u id)
@学生队列将改变!

@仍然使用此方法将student.queue作业保存到所有学生队列中。哦,抱歉,它实际上也在执行相同的操作。让我想想。那个控制器需要严格节食。@jvillian嘿,谢谢,你介意指出我可以做些什么来减肥,或者我应该避免吗?当然,把它作为一个单独的问题发布,我很乐意提供一些想法。