| Class | CrossCrusadeTeamCompetition |
| In: |
app/models/competitions/cross_crusade_team_competition.rb
|
| Parent: | Competition |
# 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
# 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
# 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
# File app/models/competitions/cross_crusade_team_competition.rb, line 137
137: def ascending_points?
138: false
139: end
# 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
# 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
# File app/models/competitions/cross_crusade_team_competition.rb, line 150
150: def date
151: (parent && parent.start_date) || Date.today
152: end
# 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
# File app/models/competitions/cross_crusade_team_competition.rb, line 129
129: def members_only?
130: false
131: end
# File app/models/competitions/cross_crusade_team_competition.rb, line 133
133: def minimum_events
134: nil
135: end
# 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
# File app/models/competitions/cross_crusade_team_competition.rb, line 162
162: def set_name
163: self.name = "Team Competition"
164: end
# 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
# 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
# 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