Class TeamBar
In: app/models/competitions/team_bar.rb
Parent: Competition

Sum all of Team‘s discipline BAR‘s results team = source_result.team

Methods

Public Instance methods

Duplicate calculation of points here with BAR Could derive points from competition_result.scores

[Source]

    # 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

[Source]

     # 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

[Source]

    # 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

[Source]

    # 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

[Source]

     # File app/models/competitions/team_bar.rb, line 117
117:   def friendly_name
118:     "Team BAR"
119:   end

[Source]

   # 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

[Source]

     # 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

[Source]

     # 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

[Source]

    # 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

[Validate]