Цикл по командам с пользователями в рельсах - PullRequest
0 голосов
/ 07 января 2019

Я искал по сайту и не смог найти именно то, что искал.

Я работал над образцом быстрого маленького рельса, в котором у меня есть Teams, у которого есть _many Users. У каждого пользователя есть несколько записей о шагах, и каждый шаг содержит количество шагов и прикрепленный скриншот.

Я хочу отобразить 5 лучших групп с наибольшим количеством шагов (объединенные шаги всех пользователей в группе).

Это всего лишь хобби-проект, и возможно, что он не будет следовать по правильному пути, но зацикливание не показалось мне подходящим, поэтому я просто хотел выложить его и посмотреть, есть ли лучший способ.

Это то, что я сделал.

    /app/controllers/concerns/application_helper.rb

    module ApplicationHelper
    def topfiveteams
        @topfiveteamswithcount
        @totalcount = 0
        @all_teamshash = {}
        Team.all.each do |team|   ---> Loop 1
                teamcount = 0
                team.users.each do |user|  ---> Loop 2
                    userstepcount = 0
                    user.steps.each do |step|  ---> Loop 3
                        userstepcount += step.stepcount
                    end
                teamcount += userstepcount
                end
                @all_teamshash[team.teamname] = teamcount
        end

        h = @all_teamshash.sort_by {|_key, value| value}.reverse.to_h
        @topfiveteamswithcount = h.first(5).to_h

    end
end

Есть ли более чистый путь в RoR?

1 Ответ

0 голосов
/ 07 января 2019

Team.joins(users: :steps).group(:id).order('SUM(stepcount) DESC').limit(5)

Если вы хотите указать только идентификатор команды и сумму счетчика шагов, закончите с pluck('teams.id, SUM(stepcount)')

Это разделит все steps на группы в зависимости от их команды. Затем вы упорядочиваете группы по сумме stepcount по убыванию. Затем вы можете получить 5 лучших результатов, чтобы получить 5 команд с наибольшим общим количеством шагов.

Я почти уверен, что Rails достаточно умен, чтобы правильно анализировать group(:id), но если вы получаете ошибку 'неоднозначное имя столбца', обновите ее до group('teams.id').

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...