我有一个User
模型,has_one
Picture
(carrierwave
后端)和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
字段就会消失。
如何修复此查询?如果你能就这个话题提出建议,我将非常高兴。
答案 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,因此更具有数据库特性,但由于每个用户返回一行,因此很容易理解和扩展。