Class CrossCrusadeTeamCompetition
In: app/models/competitions/cross_crusade_team_competition.rb
Parent: Competition

Team‘s top ten results for each Event. Last-place points penalty if team has fewer than ten finishers.

Methods

Public Class methods

[Source]

    # File app/models/competitions/cross_crusade_team_competition.rb, line 7
 7:   def CrossCrusadeTeamCompetition.calculate!(year = Date.today.year)
 8:     benchmark("#{name} calculate!", Logger::INFO, false) {
 9:       transaction do
10:         series = Series.find(
11:                        :first, 
12:                        :conditions => ["name = ? and date between ? and ?", "Cross Crusade", Date.new(year, 1, 1), Date.new(year, 12, 31)])
13: 
14:         if series && series.has_results_including_children?(true)
15:           team_competition = series.child_competitions.detect { |c| c.is_a? CrossCrusadeTeamCompetition }
16:           unless team_competition
17:             team_competition = self.new(:parent_id => series.id)
18:             team_competition.save!
19:           end
20:           team_competition.destroy_races
21:           team_competition.create_races
22:           team_competition.calculate!
23:         end
24:       end
25:     }
26:     true
27:   end

Public Instance methods

[Source]

    # File app/models/competitions/cross_crusade_team_competition.rb, line 33
33:   def add_source_events
34:     parent.children.each do |source_event|
35:       source_events << source_event
36:     end
37:   end

[Source]

     # File app/models/competitions/cross_crusade_team_competition.rb, line 87
 87:   def after_create_competition_results_for(race)
 88:     source_events.select(&:has_results?).each do |source_event|
 89:       race.results.each do |competition_result|
 90:         scores_for_event_count = Score.count(
 91:            :conditions => ["competition_result_id = ? and events.id = ?", competition_result.id, source_event.id ],
 92:            :include => { :source_result => { :race => :event } }
 93:          )
 94: 
 95:         case scores_for_event_count
 96:         when 0
 97:           competition_result.scores.create!(
 98:             :points => 1_000, 
 99:             :competition_result => competition_result,
100:             :source_result => competition_result,
101:             :event_name => source_event.full_name,
102:             :description => "Absentee Warriors",
103:             :date => source_event.date
104:           )
105:         when 1..10
106:           competition_result.scores.create!(
107:             :points => 100 * (10 - scores_for_event_count), 
108:             :competition_result => competition_result, 
109:             :source_result => competition_result,
110:             :event_name => source_event.full_name,
111:             :description => "Absentee Warriors",
112:             :date => source_event.date
113:           )
114:         else
115:           scores_for_event = competition_result.scores.select { |s| s.source_result.event == source_event }
116:           scores_for_event.sort! { |x, y| x.points <=> y.points }
117:           lowest_scores = scores_for_event[10, scores_for_event.count - 10]
118:           lowest_scores.each do |lowest_score|
119:             competition_result.scores.destroy lowest_score
120:           end
121:           # Rails destroys Score in database, but doesn't update the current association
122:           competition_result.scores true
123:         end
124:       end
125:     end
126:   end

[Source]

     # File app/models/competitions/cross_crusade_team_competition.rb, line 137
137:   def ascending_points?
138:     false
139:   end

[Source]

    # File app/models/competitions/cross_crusade_team_competition.rb, line 69
69:   def create_competition_results_for(results, race)
70:     competition_result = nil
71:     results.each do |source_result|
72:       team = source_result.team
73:       if team.member?
74:         unless competition_result && competition_result.team == team
75:           competition_result = Result.create!(:team => team, :race => race)
76:         end
77: 
78:         competition_result.scores.create(
79:           :source_result => source_result, 
80:           :competition_result => competition_result, 
81:           :points => points_for(source_result)
82:         )
83:       end
84:     end
85:   end

[Source]

    # File app/models/competitions/cross_crusade_team_competition.rb, line 29
29:   def create_races
30:     races.create!(:category => Category.find_or_create_by_name("Team"), :result_columns => ??{ place team_name points })
31:   end

[Source]

     # File app/models/competitions/cross_crusade_team_competition.rb, line 150
150:   def date
151:     (parent && parent.start_date) || Date.today
152:   end

[Source]

     # File app/models/competitions/cross_crusade_team_competition.rb, line 154
154:   def end_date
155:     parent && parent.end_date
156:   end

Member teams, people

[Source]

     # File app/models/competitions/cross_crusade_team_competition.rb, line 129
129:   def members_only?
130:     false
131:   end

[Source]

     # File app/models/competitions/cross_crusade_team_competition.rb, line 133
133:   def minimum_events
134:     nil
135:   end

[Source]

     # File app/models/competitions/cross_crusade_team_competition.rb, line 141
141:   def points_for(source_result)
142:     place = source_result.place.to_i
143:     if place > 0 && place < 100
144:       place
145:     else
146:       100
147:     end
148:   end

[Source]

     # File app/models/competitions/cross_crusade_team_competition.rb, line 162
162:   def set_name
163:     self.name = "Team Competition"
164:   end

[Source]

     # File app/models/competitions/cross_crusade_team_competition.rb, line 158
158:   def set_notes
159:     self.notes = %Q{ In accordance with the Geneva Conventions, the official teams of the Cross Crusade have entered into a State of War for domination of the realm. <a href="http://crosscrusade.com/series.html" class="obvious">rules of engagement</a>. }
160:   end

source_results must be in team-order

[Source]

    # File app/models/competitions/cross_crusade_team_competition.rb, line 49
49:   def source_results(race)
50:     return [] if parent.children.empty?
51: 
52:     event_ids = parent.children.collect do |event|
53:       event.id
54:     end
55:     event_ids = event_ids.join(', ')
56:     category_ids = category_ids_for(race)
57: 
58:     Result.find_by_sql(
59:       %Q{ SELECT results.id as id, race_id, person_id, results.team_id, place FROM results  
60:           JOIN races ON races.id = results.race_id 
61:           JOIN events ON races.event_id = events.id 
62:           WHERE results.team_id is not null
63:           and events.id in (#{event_ids})
64:           order by results.team_id
65:         }
66:     )
67:   end

[Source]

    # File app/models/competitions/cross_crusade_team_competition.rb, line 39
39:   def source_results_with_benchmark(race)
40:     results = []
41:     Overall.benchmark("#{self.class.name} source_results", Logger::DEBUG, false) {
42:       results = source_results(race)
43:     }
44:     logger.debug("#{self.class.name} Found #{results.size} source results for '#{race.name}'") if logger.debug?
45:     results
46:   end

[Validate]