【发布时间】:2017-12-31 07:33:17
【问题描述】:
Rails 5.1.2
这是有问题的两个模型。
class Person < ApplicationRecord
has_many :awards
end
class Award < Application Record
belongs_to :person
end
Award 模型有一个名为rank 的列,可以是1、2 或3,还有一个名为category 的列(也是整数,但现在我们只使用字母) .
我正在尝试根据他们的awards 的某个排名对People 进行排名。许多人可以拥有相同数量的等级。例如,40 人可能有 30 个类别 X 的 1 级奖项。
例如:
A 类别获奖最多
People 授予Award 和Rank 1 8 次
- 第 1 个人
- 第二个人
People 授予 Award 和 Rank 2 30 次
- 第 1 个人
- 第 7 人
- 19 号人
People 授予Award 和Rank 3 60 次
- 第二个人
- 19 号人
- 44 人
我想构建一个返回 People 集合的查询。
从逻辑上讲,这就是我的查询应该做的(在伪代码中):
Get all `people` who have the maximum `count` of awards where `awards.category` is `A` and `awards.rank` is `1`.
...对排名2 和排名3 重复此操作。
由于类别的含义,counter_cache 不起作用(除非我为每个类别创建一个 counter_cache,但这感觉非常多余且不灵活)。
像往常一样,一个听起来很简单的想法结果比我想象的要复杂得多,我不知道如何实现它。
【问题讨论】:
-
它更像是按
count的降序获得所有people,其中awards.category是A和awards.rank是1? -
顺序无关紧要,因为我希望所有
people拥有某个类别和排名的某个奖项的最大count。我可以这样做:Award.where(rank: 1, category: 0).group(:person_id).count它将返回一个有序的哈希{ id(integer) => count(integer) },然后按值排序,并获取所有计数最高的 id(哈希的键)(可以有多人排名第一)。 -
但是,我上面评论的解决方案绝对不优雅,而且可能会很慢,特别是如果我在一页上使用各种类别和排名组合来执行此操作。
标签: ruby-on-rails database querying