2016-12-21 9 views
3

У меня есть 4 таблицы: пользователи, тренировки, упражнения и результаты. «Пользователь» публикует «Результаты» для «Упражнений», которые связаны с одной «тренировкой». Но когда пользователь публикует результаты, поскольку есть несколько упражнений, результаты для одной тренировки могут быть связаны с уникальным «post_id». Я хотел бы узнать, сколько минут было выполнено пользователем в зависимости от количества предоставленных «post_ids», которые могут быть связаны с таблицей «Тренировки», где столбец «workout_duration» показывает, сколько минут длится каждая тренировка. Вот некоторые примеры данных, где в этом случае тренировка (workout_id = 1) имеет два упражнения и имеет продолжительность тренировки 1 минута.Не может значения SUM DISTINCT в Ruby on Rails

Результаты:

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| 
-------+-----------+--------+------------+---------------+ 

Разминка:

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

Я попытался получить общее количество минут, на основе ниже запрос, но он возвращает сумму 6, когда я хочу его вернуть значение 3 ... Я думаю, это связано с тем, что SUM не учитывает post_ids DISTINCT ... скорее, это просто суммирование всех post_ids.

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

Я искал высоко и низко для решений безрезультатно ... любые идеи?

EDIT: Вот сгенерированный SQL из приведенного выше запроса:

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

У вас есть сгенерированный SQL? –

+0

Привет @EricDulusil, я просто сделал быстрое редактирование и добавил сгенерированный SQL. – BYates

+0

'SELECT DISTINCT SUM (workout_duration)' выглядит неправильно. Я не знаю, как получить его в одном запросе rails. Вы можете получить список «тренировок», основанных на отдельной «post_id», и продолжительности суммы после. –

ответ

0

Я решил эту проблему с помощью необработанный SQL:

@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