فهرست منبع

Improve SQL queries for teacher-class-subject relationships

Andrea Fazzi 6 سال پیش
والد
کامیت
5b96df788f
2فایلهای تغییر یافته به همراه40 افزوده شده و 40 حذف شده
  1. 23 25
      api/teachers.go
  2. 17 15
      templates/teachers_show.html.tpl

+ 23 - 25
api/teachers.go

@@ -18,14 +18,14 @@ import (
 
 var (
 	selectUniqueTeacherClasses = `
-SELECT name FROM (SELECT activities.id,classes.name FROM activities 
+SELECT DISTINCT classes.* FROM activities 
 INNER JOIN classes on classes.id=activities.class_id 
-WHERE teacher_id=?) as grouped GROUP BY name`
+WHERE teacher_id=?`
 
 	selectUniqueTeacherSubjects = `
-SELECT name FROM (SELECT activities.id,subjects.name FROM activities 
+SELECT DISTINCT subjects.* FROM activities 
 INNER JOIN subjects on subjects.id=activities.subject_id 
-WHERE activities.teacher_id=?) as grouped GROUP BY name`
+WHERE activities.teacher_id=?`
 )
 
 func teachersHandler() http.Handler {
@@ -50,33 +50,31 @@ func teachersHandler() http.Handler {
 
 func teacherShowHandler() http.Handler {
 	fn := func(w http.ResponseWriter, r *http.Request) {
-		var data struct {
-			Teacher    orm.Teacher
-			Subjects   []orm.Subject
-			Classes    []orm.Class
-			Activities []orm.Activity
-		}
-		if err := orm.DB().First(&data.Teacher, mux.Vars(r)["id"]).Error; err != nil {
-			panic(err)
-		}
+		var teacher orm.Teacher
 
-		if err := orm.DB().Model(&data.Teacher).Related(&data.Subjects, "Subjects").Error; err != nil {
+		if err := orm.DB().First(&teacher, mux.Vars(r)["id"]).Error; err != nil {
 			panic(err)
 		}
 
-		if err := orm.DB().Model(&data.Teacher).Related(&data.Classes, "Classes").Error; err != nil {
-			panic(err)
-		}
-		sort.Slice(data.Classes, func(i, j int) bool {
-			return strings.ToLower(data.Classes[i].Name) < strings.ToLower(data.Classes[j].Name)
+		orm.DB().Raw(selectUniqueTeacherClasses, mux.Vars(r)["id"]).Scan(&teacher.Classes)
+
+		sort.Slice(teacher.Classes, func(i, j int) bool {
+			return strings.ToLower(teacher.Classes[i].Name) < strings.ToLower(teacher.Classes[j].Name)
 		})
-		if err := orm.DB().Model(&data.Teacher).Related(&data.Activities, "Activities").Error; err != nil {
-			panic(err)
-		}
-		sort.Slice(data.Activities, func(i, j int) bool {
-			return data.Activities[i].Hours > data.Activities[j].Hours
+
+		orm.DB().Raw(selectUniqueTeacherSubjects, mux.Vars(r)["id"]).Scan(&teacher.Subjects)
+
+		sort.Slice(teacher.Subjects, func(i, j int) bool {
+			return strings.ToLower(teacher.Subjects[i].Name) < strings.ToLower(teacher.Subjects[j].Name)
 		})
-		if err := renderer.Render(w, "base", "teachers_show", data); err != nil {
+
+		orm.DB().Table("activities").Select("*").Where("teacher_id = ?", mux.Vars(r)["id"]).Scan(&teacher.Activities)
+
+		sort.Slice(teacher.Activities, func(i, j int) bool {
+			return teacher.Activities[i].Hours < teacher.Activities[j].Hours
+		})
+
+		if err := renderer.Render(w, "base", "teachers_show", teacher); err != nil {
 			panic(err)
 		}
 	}

+ 17 - 15
templates/teachers_show.html.tpl

@@ -4,22 +4,22 @@
 
   <ol class="breadcrumb">
     <li><a href="/teachers">Docenti</a></li>
-    <li class="active"><a href="#">{{.Teacher.Name}} {{.Teacher.Surname}}</a></li>
+    <li class="active"><a href="#">{{.Name}} {{.Surname}}</a></li>
   </ol>
 
   <div class="karmen-info-header">
     <div class="row">
       <div class="col-md-8">
-	<h1>{{.Teacher.Name}} {{.Teacher.Surname}}</h1>
+	<h1>{{.Name}} {{.Surname}}</h1>
       </div>
       <div class="col-md-4">
 	<div class="btn-group pull-right" role="group">
-	  <a href="/teachers/{{.Teacher.ID}}/update" class="btn btn-primary">
+	  <a href="/teachers/{{.ID}}/update" class="btn btn-primary">
 	    <span class="glyphicon glyphicon-pencil" aria-hidden="true"></span>
 	    Modifica
 	  </a>
-	  <button href="/teachers/{{.Teacher.ID}}/delete"
-		  data-url="/teachers/{{.Teacher.ID}}/delete"
+	  <button href="/teachers/{{.ID}}/delete"
+		  data-url="/teachers/{{.ID}}/delete"
 		  class="btn btn-danger karmen-ajax-delete">
 	    <span class="glyphicon glyphicon-trash" aria-hidden="true"></span>
 	    Elimina
@@ -35,19 +35,20 @@
       <h2 class="karmen-relation-header">Materie</h2>
       {{if .Subjects}}
       <div class="list-group" id="materie_list_group">
-	{{range $subject := .Subjects}}
-	<a href="/subjects/{{$subject.ID}}" class="list-group-item clearfix">
-	  <span class="glyphicon glyphicon-book"></span>
-	  {{$subject.Name}}
-	  {{end}}
-	</a>
+    	{{range $subject := .Subjects}}
+    	<a href="/subjects/{{$subject.ID}}" class="list-group-item clearfix">
+    	  <span class="glyphicon glyphicon-book"></span>
+    	  {{$subject.Name}}
+    	  {{end}}
+    	</a>
       </div>
       {{else}}
       <p>Al docente non è associata alcuna attività
-	didattica. Clicca <a href="/activities/add">qui</a> per
-	creare una nuova attività didattica da associare al docente.</p>
+    	didattica. Clicca <a href="/activities/add">qui</a> per
+    	creare una nuova attività didattica da associare al docente.</p>
       {{end}}
     </div>
+    
   </div>
 
   <div class="row">
@@ -69,6 +70,7 @@
 	creare una nuova attività didattica da associare al docente.</p>
       {{end}}
     </div>
+    
   </div>
 
   <div class="row">
@@ -85,7 +87,7 @@
 	</a>
       </div>
       
-      {{if $classes := $.Teacher.IsCoordinator}}
+      {{if $classes := $.IsCoordinator}}
       <p>Il docente è <strong>coordinatore</strong> nelle seguenti classi</p>
       <div class="list-group" id="coord_classes_list_group">
 	{{range $class := $classes}}
@@ -97,7 +99,7 @@
       </div>
       {{end}}
 
-      {{if $classes := $.Teacher.IsMinuter}}
+      {{if $classes := $.IsMinuter}}
       <p>Il docente è <strong>verbalizzante</strong> nelle seguenti classi</p>
       <div class="list-group" id="coord_classes_list_group">
 	{{range $class := $classes}}