Ruby on rails 按子方法对记录进行排序,并按其他关联进行分组

Ruby on rails 按子方法对记录进行排序,并按其他关联进行分组,ruby-on-rails,ruby-on-rails-4,activerecord,Ruby On Rails,Ruby On Rails 4,Activerecord,好的,下面是示例设置: House有许多已完成的工作属于一个人 CompletedJobs有一个名为total_score的方法,该方法基于模型中的数据动态生成。输出是一个大于零的整数。例如: @completed_job1.total_score #>output: 25 @completed_job2.total_score #>output: 13 我想做的是根据前两个房屋的总得分,抓取前20个完成的工作,并返回完成这些工作的人的姓名 示例伪代码如下所示: Hou

好的,下面是示例设置:

House
有许多
已完成的工作
属于一个人

CompletedJobs
有一个名为
total_score
的方法,该方法基于模型中的数据动态生成。输出是一个大于零的整数。例如:

@completed_job1.total_score    #>output: 25
@completed_job2.total_score    #>output: 13
我想做的是根据前两个
房屋
的总得分,抓取前20个
完成的工作
,并返回完成这些工作的
人的姓名

示例伪代码如下所示:

House
  .last(2)
  .sort_by{ SUM_OF_COMPLETED_JOBS_GROUPED_BY_PERSON }
  .map{ [SUM_OF_PERSONS_JOB_SCORE, PERSON] }
  .first(20)
我尝试过几种方法(都是从查询中的
House
开始,也从
Person
开始),但我真的很困惑于如何按个人对分数总和进行分组,然后将它们映射到一个数组中

关于如何在SQL(伪代码)中执行此操作的另一个示例:

我如何组合
h1
h2
,然后按最高总分排序

更新2

我能够像这样组合和求和这些值:

(h1_a + h2_a).group_by(&:last).map{|k,v| [k, v.map(&:first).inject(:+)]}

如何在一个查询中完成所有这些?我所做的确实有效,但似乎太粗糙了:)

我不确定您想要得到什么-一个SQL查询?还是短的红宝石一衬

Ruby代码:

# load all data into memory
houses = House.all.includes(completed_jobs: :person).last(2)

# process all in memory
houses.flat_map(&:completed_jobs).sort_by(&:total_score).last(20).group_by(&:person)
SQL查询(我知道唯一的方法是进行子查询):

(h1_a + h2_a).group_by(&:last).map{|k,v| [k, v.map(&:first).inject(:+)]}
# load all data into memory
houses = House.all.includes(completed_jobs: :person).last(2)

# process all in memory
houses.flat_map(&:completed_jobs).sort_by(&:total_score).last(20).group_by(&:person)
SELECT t.name, SUM(t.total_scope)
FROM (
  SELECT p.name, j.total_score
  FROM houses h           // may be this table is excessive but...
    JOIN completed_jobs j ON j.house_id = h.id
    JOIN persons p ON p.id = j.person_id
  WHERE j.created_at > :week_ago_parameter
  ORDER BY j.total_score
  LIMIT 20
) t
GROUP BY t.name