2012-08-15 10 views
5

Estoy tratando de recorrer una lista de registros que se recuperan con find_each.Error de salto local Ningún bloque dado error (rendimiento) en find_each

He impreso el código de mi controlador en la respuesta en este stack overflow post, pero sigo obteniendo el error "No dar bloque (Rendimiento)".

Estoy empezando en Ruby and Rails y todavía no he encontrado una explicación completa (muchos ejemplos básicos) de bloques y rendimiento que me da lo que necesito.

Mi código es el siguiente:

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 

y el error de puntos a la línea con find_each.

Sé que necesito un bloque para ceder, pero cómo se vería exactamente en este caso particular se me escapa.

Gracias por cualquier sugerencia.

+0

Estás ignorando el valor de retorno de 'new_subject.save'. – meagar

Respuesta

5

Está pasando un bloque a where y no hay bloque a find_each. No puedes hacer eso. Es necesario revertir find_each y where en esta línea, el orden es importante que el bloque se pasa al último método invocado:

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

Debe leer:

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

Su próximo problema es que' Estoy tratando de iterar sobre assignments, que es una única asignación. find_each ya está haciendo la iteración por usted, pasando una asignación al bloque a la vez. El bloque debe decir:

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

Voy a hacer la suposición de que el sujeto tiene muchas misiones, ya que tiene una subject_id dentro de su clase Assignment. Si este es el caso, la última y más correcta manera de escribir su bucle sería:

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

Su suposición fue puntual. Gracias por la respuesta elegante. – lonC

Cuestiones relacionadas