| Class | TeamBar |
| In: |
app/models/competitions/team_bar.rb
|
| Parent: | Competition |
Sum all of Team‘s discipline BAR‘s results team = source_result.team
Duplicate calculation of points here with BAR Could derive points from competition_result.scores
# File app/models/competitions/team_bar.rb, line 37
37: def create_competition_results_for(results, race)
38: competition_result = nil
39: results.each do |source_result|
40: logger.debug("#{self.class.name} scoring result: #{source_result.race.name} #{source_result.place} #{source_result.name} #{source_result.team_name}") if logger.debug?
41:
42: teams = extract_teams_from(source_result)
43: logger.debug("#{self.class.name} teams for result: #{teams}") if logger.debug?
44: for team in teams
45: if member?(team, source_result.date)
46:
47: if first_result_for_team(source_result, competition_result)
48: # Bit of a hack here, because we split tandem team results into two results,
49: # we can't guarantee that results are in team-order.
50: # So 'first result' really means 'not the same as last result'
51: competition_result = race.results.detect {|result| result.team == team}
52: competition_result = race.results.create(:team => team) if competition_result.nil?
53: end
54:
55: score = competition_result.scores.create(
56: :source_result => source_result,
57: :competition_result => competition_result,
58: :points => points_for(source_result).to_f / teams.size
59: )
60: end
61: end
62: end
63: end
# File app/models/competitions/team_bar.rb, line 113
113: def default_discipline
114: "Team"
115: end
Simple logic to split team results (tandem, team TTs) between teams Just splits on first slash, so "Bike Gallery/Veloce" becomes "Bike Gallery" and "Veloce" This method probably gets things wrong sometimes
# File app/models/competitions/team_bar.rb, line 68
68: def extract_teams_from(source_result)
69: return [] unless source_result.team
70:
71: if source_result.race.category.name.include?('Tandem')
72: teams = []
73: team_names = source_result.team.name.split("/")
74: teams << Team.find_by_name_or_alias_or_create(team_names.first)
75: if team_names.size > 1
76: name = team_names[1, team_names.size - 1].join("/")
77: teams << Team.find_by_name_or_alias_or_create(name)
78: end
79: teams
80: elsif source_result.team.name == 'Forza Jet Velo'
81: [ Team.find_or_create_by_name('Half Fast Velo') ]
82: else
83: [ source_result.team ]
84: end
85: end
# File app/models/competitions/team_bar.rb, line 87
87: def first_result_for_team(source_result, competition_result)
88: competition_result.nil? || source_result.team != competition_result.team
89: end
# File app/models/competitions/team_bar.rb, line 117
117: def friendly_name
118: "Team BAR"
119: end
# File app/models/competitions/team_bar.rb, line 6 6: def point_schedule 7: [ 0, 15, 14, 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1 ] 8: end
Apply points from point_schedule, and adjust for field size
# File app/models/competitions/team_bar.rb, line 92
92: def points_for(source_result, team_size = nil)
93: points = 0
94: Bar.benchmark('points_for') {
95: field_size = source_result.race.field_size
96:
97: team_size = team_size || Result.count(:conditions => ["race_id =? and place = ?", source_result.race.id, source_result.place])
98: points = point_schedule[source_result.place.to_i] * source_result.race.bar_points / team_size.to_f
99: if source_result.race.bar_points == 1 and field_size >= 75
100: points = points * 1.5
101: end
102: }
103: points
104: end
# File app/models/competitions/team_bar.rb, line 106
106: def set_parent
107: if parent.nil?
108: self.parent = OverallBar.find_or_create_for_year(year)
109: save!
110: end
111: end
Find the source results from discipline BAR‘s competition results. Could approach this a couple of other ways. This way trades SQL complexity for less duplicate code
# File app/models/competitions/team_bar.rb, line 13
13: def source_results(race)
14: Result.find_by_sql(
15: %Q{SELECT results.*
16: FROM results
17: LEFT OUTER JOIN races ON races.id = results.race_id
18: LEFT OUTER JOIN events ON races.event_id = events.id
19: LEFT OUTER JOIN categories ON races.category_id = categories.id
20: where results.id in (select source_result_id
21: from scores
22: LEFT OUTER JOIN results as competition_results
23: ON competition_results.id = scores.competition_result_id
24: LEFT OUTER JOIN races as competition_races
25: ON competition_races.id = competition_results.race_id
26: LEFT OUTER JOIN events as competition_events
27: ON competition_races.event_id = competition_events.id
28: where competition_events.type = 'Bar'
29: and competition_events.date >= '#{date.year}-01-01'
30: and competition_events.date <= '#{date.year}-12-31')
31: order by results.team_id}
32: )
33: end