我搜索了该网站,但找不到确切的内容。
我正在开发一个快速的小型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中有更清洁的方法吗?
答案 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')
。