2016-02-26 28 views
0

我的AssignmentsController中有一個batch_create方法,允許Assigners一次將賦值分配給多個學生。這將assignment_id保存到每個學生的隊列字段中。 assignment_id被序列化爲JSON並作爲數組存儲在每個學生的隊列字段中。使用Rails 4中的嵌套循環一次創建多個對象

我的問題是,當前使用batch_create進行質量分配分配時,學生隊列中的相同assignment_ids最終會出現。我需要爲每個batch_create方法只爲每個學生的隊列分配一個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 
+0

該控制器需要去一個** **嚴重的飲食。 – jvillian

+0

@jvillian嘿謝謝,你介意指出我可以做些什麼來減少它或我應該避免? – gnycl

+0

當然,把它作爲一個單獨的問題發佈,我很樂意提供想法。 – jvillian

回答

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 
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 

應該這樣做。

+0

使用此方法仍將分配保存到所有學生隊列中。 – gnycl

+0

哦,對不起,它實際上是在做同樣的事情。讓我弄明白。 – tanvir2362