遍历团队,让用户参与其中

时间:2019-01-06 22:28:42

标签: ruby-on-rails ruby

我搜索了该网站,但找不到确切的内容。

我正在开发一个快速的小型Rails示例应用程序,其中有Teams和have_many Users。每个用户都有很多步骤记录,每个步骤都包含步骤计数和所附的屏幕截图。

我想显示具有最高步数的前5个组(组中所有用户的合并步数)。

这只是一个业余项目,可能没有遵循正确的方法,但是循环对我来说并不正确,因此只想将其放到那里,看看是否有更好的方法。 / p>

这就是我所做的。

    /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 :(得分:3)

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

如果仅需要团队ID和步数总和,则以pluck('teams.id, SUM(stepcount)')

结尾

这将根据他们的团队将所有steps分成几组。然后,按stepcount降序之和对组进行排序。然后,您可以获取前5个结果,以使5个团队的总体计步数最高。

我很确定Rails足够聪明,可以正确解析group(:id),但是如果遇到“模棱两可的列名”错误,请将其更新为group('teams.id')