2012-08-15 25 views
5

Tôi đang cố gắng duyệt qua danh sách các bản ghi được truy xuất bằng find_each.Lỗi Nhảy Địa phương Không có lỗi nào được cung cấp (năng suất) trên find_each

Tôi đã tạo mẫu mã điều khiển của mình trên câu trả lời trong số stack overflow post này, nhưng tôi vẫn nhận được lỗi "Không chặn được (lợi nhuận)".

Tôi chỉ mới bắt đầu trong Ruby và Rails và tôi chưa tìm thấy lời giải thích chính xác (nhiều ví dụ cơ bản) về khối và sản lượng mang lại cho tôi những gì tôi cần.

Mã của tôi trông như thế này:

def select_save 
    @class = params[:class] 
    @student_id = params[:id] 
    @class.each do |id| 
     old_subject = Subject.find(id) 
     new_subject = old_subject.dup 
     new_subject.student_id = @student_id 
     new_subject.save 
     Assignment.find_each.where(:subject_id => id) do |assignments| 
     assignments.each do |a| 
      new_assignment = a.dup 
      new_assignment.subject_id = new_subject.id 
      new_assignment.save 
     end 
     end 
    end 

    respond_to do |format| 
     format.html { redirect_to @student, :notice => 'Subject and assignments created.' } 
    end 
    end 

và lỗi điểm đến phù hợp với find_each.

Tôi biết tôi cần một khối để thu được, nhưng chính xác như thế nào trong trường hợp cụ thể này sẽ thoát khỏi tôi.

Cảm ơn mọi đề xuất.

+0

Bạn đang bỏ qua các giá trị trả về của 'new_subject.save'. – meagar

Trả lời

5

Bạn đang chuyển một khối đến where và không chặn đến find_each. Bạn không thể làm điều đó. Bạn cần phải đảo ngược find_eachwhere trên dòng này, thứ tự là quan trọng như khối được truyền cho phương thức cuối cùng gọi:

Assignment.find_each.where(:subject_id => id) do |assignments| 

Nó nên đọc:

Assignment.where(:subject_id => id).find_each do |assignments| 

vấn đề tiếp theo của bạn là bạn' đang cố gắng lặp lại trên assignments, là một Nhiệm vụ duy nhất. find_each đã thực hiện lặp lại cho bạn, chuyển một nhiệm vụ vào khối tại một thời điểm. Khối nên đọc:

Assignment.where(:subject_id => id).find_each do |assignment| 
    new_assignment = assignment.dup 
    new_assignment.subject_id = new_subject.id 
    new_assignment.save 
end 

tôi sẽ làm cho các giả định rằng Chủ đề của bạn có nhiều bài tập, vì bạn có một subject_id bên trong lớp Assignment của bạn. Nếu đây là trường hợp, trận chung kết và hầu hết đúng cách để viết vòng lặp của bạn sẽ là:

old_subject.assignments.each do |assignment| 
    new_assignment = assignment.dup 
    new_assignment.subject_id = new_subject.id 
    new_assignment.save 
end 
+0

Giả định của bạn là tại chỗ. Cảm ơn câu trả lời thanh lịch. – lonC

Các vấn đề liên quan