0

我正在努力弄清楚如何最好地做到这一点……我有比赛,每天都会举行,参赛者参加,他们在每场比赛中都得到一个分数。我希望能够检索在一段时间内发生的比赛中每个参赛者的总分,并获得Rails 仍然可以使用的“虚拟”比赛模型(即单行)。


我的代码/数据结构如下:

比赛:
has_many :contestant_scores
has_many :contestants, through: :contestant_scores
专栏:id, date

参赛者:
has_many :contestant_scores
专栏:id, name

ContestantScore:
belongs_to :competition
belongs_to :contestant
列:competition_id, contestant_id, score


给定以下数据:

(competitions)
id | date
---------------
0  | 2013-01-01
1  | 2013-01-02
2  | 2013-01-03

(contestants)
id | name
--------------
0  | Jake
1  | Finn
2  | Bubblegum

(contestant_scores)
competition_id | contestant_id | score
--------------------------------------
0              | 0             | 1
0              | 1             | 2
0              | 2             | 3
1              | 0             | 1
1              | 1             | 2
1              | 2             | 3
2              | 0             | 1
2              | 1             | 2
2              | 2             | 3

我将如何检索 2013-01-01 和 2013-01-03 之间的所有比赛,并获得每个参赛者的总分(按最高分排序)?基本上,我想要:

  • 带有nilid 和日期的单个竞赛结果(因为它是“虚拟的”)
  • 能够做到virtual_competition.scores.first.score并得到9
  • 能够做到virtual_competition.scores.first.contestant.name并得到"Bubblegum"

我希望这是有道理的,希望你能指出我正确的方向。如果需要,我不反对使用更“纯”的 SQL,重要的是我将能够利用 ActiveRecord 的对象映射与结果。

如果这有什么不同,我将使用 Postgres 作为数据库。

4

1 回答 1

0
start_date = Date.new("2013-01-01")
end_date = Date.new("2013-01-03")
Competition.include(:contestant_scores => :contestant).where(:date => start_date..end_date).group("contestants.id").order("contestant_scores.score")

我想你需要这样的东西

于 2013-01-24T11:25:20.973 回答