2013-01-24 70 views
0

我試圖弄清楚如何最好地去解決這個問題......我每天都會舉行比賽,參賽者將參加比賽,並且每場比賽都會得到一個分數。我希望能夠檢索在某一段時間內參加比賽的每位參賽者的總分,並獲得Rails仍然可以使用的「虛擬」比賽模型(即單排)。使用has_many進行計算,:通過ActiveRecord關係?


我的代碼/數據的結構是這樣的:

比賽:
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之間的所有比賽,並獲得每位參賽者的總分(按最高分排序)?基本上,我想:

  • nil ID和日期(因爲它是「虛擬」)
  • 要能夠做到virtual_competition.scores.first.score,並得到9
  • 要能夠做到virtual_competition.scores.first.contestant.name和單一的比賽結果得到"Bubblegum"

我希望這是有道理可言的,希望你能指出我在正確的方向。如果需要的話,我並不反對使用更多的「純粹」SQL,重要的是我將能夠利用ActiveRecord的對象映射和結果。

我使用Postgres的數據庫,如果這有什麼區別。

回答

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") 

我想你需要類似的東西

+0

謝謝!雖然這給了我3個單獨的比賽,並且沒有增加比分,對吧......?對不起,如果我在這裏很濃厚 - 隨着我的進步而學習。 –

相關問題