У меня есть 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]]
У вас есть сгенерированный SQL? –
Привет @EricDulusil, я просто сделал быстрое редактирование и добавил сгенерированный SQL. – BYates
'SELECT DISTINCT SUM (workout_duration)' выглядит неправильно. Я не знаю, как получить его в одном запросе rails. Вы можете получить список «тренировок», основанных на отдельной «post_id», и продолжительности суммы после. –