2016-12-21 1 views
3

J'ai 4 tables: Utilisateurs, Entraînements, Exercices et Résultats. Un "Utilisateur" affiche "Résultats" pour "Exercices" qui sont liés à un seul "Entraînement". Mais lorsque l'utilisateur publie des résultats, puisqu'il y a plusieurs exercices, les résultats d'un entraînement peuvent être liés à un "post_id" unique. Je voudrais savoir combien de minutes totaux un utilisateur a exercé en fonction du nombre de "post_ids" qu'ils ont fournis qui peuvent être liés au tableau "Workouts" où une colonne "workout_duration" montre combien de minutes chaque entraînement dure. Voici quelques exemples de données, où dans ce cas, l'entraînement (workout_id = 1) a deux exercices et a une durée de workout_duration de 1 minute.Les valeurs SOMME DISTINCT ne peuvent pas apparaître dans Ruby on Rails

Résultats:

user_id| workout_id| post_id| exercise_id| number_of_reps| 
-------+-----------+--------+------------+---------------+ 
    123|   1 |  1|   1 |    18| 
    123|   1 |  1|   2 |    29|  
    123|   1 |  2|   1 |    15| 
    123|   1 |  2|   2 |    30| 
    123|   1 |  3|   1 |    20| 
    123|   1 |  3|   2 |    28| 
-------+-----------+--------+------------+---------------+ 

Entraînements:

workout_id| workout_duration| 
----------+-----------------+ 
     1|    1| 

j'ai essayé de récupérer le nombre total de minutes en fonction de la requête ci-dessous, mais il renvoie une somme de 6 quand je veux qu'il renvoie une valeur de 3 ... Je pense que c'est parce que SUM ne prend pas en compte DISTINCT post_ids ... il ne fait que sommer tous les post_ids.

@user = User.find(current_user) 
@total_minutes = @user.results.includes(:workout).select(:post_id).distinct.sum(:workout_duration) 

J'ai cherché haut et bas pour des solutions en vain ... des idées?

EDIT: Voici le SQL généré à partir de la requête ci-dessus:

SELECT DISTINCT SUM(workout_duration) 
FROM "results" 
LEFT OUTER JOIN "workouts" ON "workouts"."id" = "results"."workout_id" 
WHERE "results"."user_id" = ? [["user_id", 123]] 
+1

Avez-vous le SQL généré? –

+0

Salut @EricDuminil, je viens de faire un montage rapide et ajouté le SQL généré. – BYates

+0

'SELECT DISTINCT SUM (workout_duration)' semble incorrect. Je ne sais pas comment l'obtenir dans une requête de rails. Vous pouvez obtenir une liste de 'workouts 'en fonction d'un' post_id' distinct en premier et de la somme après. –

Répondre

0

Je résolu ce problème en utilisant SQL brute:

@minute_total = ActiveRecord::Base.connection.execute(minute_query)[0][0] 

private 
def minute_query 
"SELECT SUM(workout_duration) 
FROM (SELECT DISTINCT(results.post_id), results.user_id, workouts.workout_duration 
FROM results LEFT OUTER JOIN workouts ON results.workout_id = workouts.id 
WHERE results.user_id = #{@user.id})" 
end