Add two new parameters to tournament

instant_finalists_amount is the amount of teams that instantly are in
the finals after the group stage ends.

intermediate_round_participants_amount is the amount of teams that have
a chance to advance after group stage but must play a relegation game to
actually do so.

Both of these values need to match, so that
instant_finalists_amount + (intermediate_round_participants_amount / 2)
is a power of 2. Or to be more precise, the power of two that is saved
in playoff_teams_amount of the tournament.
This commit is contained in:
Daniel Schädler 2019-06-09 11:46:29 +02:00
parent 17640529bc
commit dffe708933
3 changed files with 18 additions and 1 deletions

View File

@ -1,7 +1,8 @@
# frozen_string_literal: true # frozen_string_literal: true
class TournamentSerializer < SimpleTournamentSerializer class TournamentSerializer < SimpleTournamentSerializer
attributes :description attributes :description, :playoff_teams_amount,
:instant_finalists_amount, :intermediate_round_participants_amount
has_many :stages has_many :stages
has_many :teams has_many :teams

View File

@ -0,0 +1,14 @@
# frozen_string_literal: true
class TournamentService
class << self
def calculate_amount_of_teams_advancing(playoff_teams_amount, amount_of_groups)
# the amount of whole places that advance in a group (e. g. all 1rst places of every group instantly go through)
instant_finalists_amount = (playoff_teams_amount.floor / amount_of_groups.floor) * amount_of_groups.floor
# the amount of teams that still need to play an intermediate round before advancing to playoffs
intermediate_round_participants_amount = (playoff_teams_amount - instant_finalists_amount) * 2
[instant_finalists_amount, intermediate_round_participants_amount]
end
end
end

View File

@ -52,6 +52,8 @@ class CreateSchema < ActiveRecord::Migration[5.2]
t.string :description t.string :description
t.boolean :public, default: true t.boolean :public, default: true
t.integer :playoff_teams_amount t.integer :playoff_teams_amount
t.integer :instant_finalists_amount, default: 0
t.integer :intermediate_round_participants_amount, default: 0
# relation to owner # relation to owner
t.belongs_to :user, index: true, null: false, foreign_key: { on_delete: :cascade } t.belongs_to :user, index: true, null: false, foreign_key: { on_delete: :cascade }