如何对单个ActiveRecord查询进行分组,求和并包含?

时间:2016-05-02 02:27:00

标签: sql ruby-on-rails ruby rails-activerecord

我有一个User模型,has_one Picturecarrierwave后端)和has_many journal s。

我需要获得前N名用户的最高分(score模型中Journal字段的总和)。

我写了这个范围

scope :top, lambda { |n=10|
  joins(:picture, :journals)
    .select("users.*, pictures.image, sum(journals.score) as total_score")
    .order("total_score desc ")
    .group("users.id", "pictures.image")
    .limit(n)
}

它有效,但是,当我尝试使用Picture获取User.top.picture时,我收到了对数据库的额外请求。

如果我在include(:picture)范围内top,那么total_score字段就会消失。

如何修复此查询?如果你能就这个话题提出建议,我将非常高兴。

1 个答案:

答案 0 :(得分:1)

我通过外部加入users到子总分来获得总分:

scope :top, lambda { |n=10|
  select("users.*, total_score").
    joins("left join (select user_id, sum(score) total_score from journals " +
      "group by user_id) total_scores on users.id = total_scores.user_id").
    order("total_score desc").
    limit(n).
    includes(:picture)
}

它使用一些手动SQL,因此更具有数据库特性,但由于每个用户返回一行,因此很容易理解和扩展。