[Rails] Site internet de la World Tartiflette Tour.
1
classTartifletteScoringService
2
defself.scored?(tartiflette,session)
3
session[:scored_tartiflettes] ||= []
4
session[:scored_tartiflettes].include?(tartiflette.id)
5
end
6
7
defself.mark_as_scored(tartiflette,session)
8
session[:scored_tartiflettes] ||= []
9
session[:scored_tartiflettes] << tartiflette.id unless scored?(,)
10
end
11
12
defself.submit_scores(tartiflette,scores,session)
13
scores.each do |scoring_criterium_id,score_params|
14
Score.create!(
15
session_id: session[:id],
16
tartiflette: tartiflette,
17
scoring_criterium_id: scoring_criterium_id,
18
value: score_params[:value]
19
)
20
end
21
mark_as_scored(,)
22
rescue ActiveRecord::RecordInvalid => e
23
raise StandardError, "Failed to create score: e.message"
24
end
25
26
defself.update_scores(tartiflette,scores,session)
27
scores.each do |score_id,score_params|
28
score = tartiflette.scores.find(score_id)
29
score.update!(value: score_params[:value])
30
end
31
rescue ActiveRecord::RecordInvalid => e
32
raise StandardError, "Failed to update score: e.message"
33
end
34
35
private
36
37
defself.average_score(tartiflette)
38
tartiflette.scores.average(:value).to_f
39
end
40
41
defself.average_score_by_category(tartiflette)
42
tartiflette
43
.scores
44
.group_by {|score| score.scoring_criterium.category }
45
.transform_values do |scores|
46
(scores.sum(&:value).to_f / scores.size).round(2)
47
end
48
end
49
50
defself.total_score_by_category(tartiflette)
51
tartiflette
52
.scores
53
.group_by {|score| score.scoring_criterium.category }
54
.transform_values do |scores|
55
scores.sum(&:value).to_f.round(2)
56
end
57
end
58
59
defself.leaderboard
60
Tartiflette
61
.joins(:scores)
62
.select("tartiflettes.*, SUM(scores.value) AS total_score")
63
.group("tartiflettes.id")
64
.order("total_score DESC")
65
.map {|tartiflette| [ tartiflette, tartiflette.total_score.to_f ] }
66
end
67
end
68