2016-05-13 12 views
0

ich ein examscore Modell mit den folgenden Spalten:durch eine Fixnum in Schienen Looping

academic_year_id, grade_id, STUDENT_ID, subject_id, total_score

und ein averagescore Modell mit diesem Spalten:

akademic_year_id , Grade_id, STUDENT_ID, durchschnittlich

Meine Forderung ist durch das Examscore Modell von academic_year_id und grade_id, und berechnen Sie die durchschnittliche Punktzahl der einzelnen Schüler für alle Themen, die von den Studenten (dh Summe Gesamtergebnis aller Fächer genommen iterieren dividiert durch die Anzahl der Probanden) speichern Sie dann den Durchschnittswert im Modell AverageScore. Ich finde das schwierig und jede Hilfe wird sehr geschätzt.

Was ich bisher getan haben, ist:

total = 0 
counter = 0 
scores = Examscore.where(:academic_year_id => 3, :grade_id => 4) 
scores.each do |std| 
    std.student_id.each do |tot| 
    total += tot.total_score 
    counter += 1 
end 
puts total.fdiv(counter) 

aber es funktioniert nicht, weil std.student_id a Fixnum kein Array.

Gibt es eine Anleitung, wie Sie sich diesem bitte nähern?

Antwort

0

Da dies eine Art Schulprojekt ist, gehe ich davon aus, dass die Tabellen nicht so groß sind. Daher sollte dies den Trick tun:

scores = Examscore.where(academic_year_id: 3, grade_id: 4) 

scores.group_by(&:student_id).each do |student_id, examscores| 
    average = examscores.sum(&:total_score)/examscores.size.to_f 
    AverageScore.create academic_year_id: 3, grade_id: 4, 
         student_id: student_id, average: average 
end 
+0

Das hat den Trick gemacht. Prost –