2013-01-24 2 views
0

J'essaie de trouver la meilleure façon de procéder ... J'ai des compétitions, qui ont lieu tous les jours, avec des participants, et ils obtiennent chacun un score dans chaque compétition. Je veux être en mesure de récupérer le score total de chaque Participant dans les Compétitions qui ont eu lieu sur une certaine période de temps, et obtenir un modèle de Compétition "virtuel" (une seule ligne) encore utilisable par Rails.Utilisation de calculs avec has_many,: via les relations ActiveRecord?


Mon code/données est structuré comme suit:

compétition:
has_many :contestant_scores
has_many :contestants, through: :contestant_scores
Colonnes: id, date

Concurrent:
has_many :contestant_scores
Colonnes: id, name

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


Étant donné les données suivantes:

(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 

Comment procéder pour récupérer toutes les compétitions entre le 01/01/2013 et le 01/01/2013 et obtenir le score total de chaque participant (trié par ordre décroissant)? Au fond, je veux:

  • un seul résultat de la concurrence avec un identifiant nil et la date (car il est « virtuel »)
  • pour pouvoir faire virtual_competition.scores.first.score et obtenir 9
  • pour pouvoir faire virtual_competition.scores.first.contestant.name et obtenir "Bubblegum"

J'espère que cela a un sens du tout, et espère que vous pouvez me diriger dans la bonne direction. Je ne suis pas opposé à l'utilisation de SQL plus "pur" si nécessaire, l'important étant que je puisse utiliser le mappage d'objet d'ActiveRecord avec le résultat. J'utilise Postgres pour la base de données si cela fait une différence.

Répondre

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

Je pense que vous avez besoin quelque chose comme ça

+0

Merci! Cela me donne 3 Compétitions séparées cependant, et il n'y a pas d'addition des scores, n'est-ce pas ...? Désolé si je suis épais ici - apprendre au fur et à mesure. –

Questions connexes