module ContestantsConcern extend ActiveSupport::Concern def ranked_contestants(contest) if contest.ranking_mode == "actual" contest.contestants.sort_by { |contestant| [ -contestant.completions.where(remaining_pieces: nil).size, (contestant.completions.where(remaining_pieces: nil).size == @contest.puzzles.length ? 1 : 0) * contestant.time_seconds, contestant.completions.size > 0 && contestant.completions[-1].remaining_pieces ? contestant.completions[-1].remaining_pieces : 1000000, contestant.time_seconds ] } elsif contest.ranking_mode == "theorical" contest.contestants.sort_by { |contestant| contestant.completions.map { |completion| completion.projected_time }.sum } end end end