44 lines
1.2 KiB
Ruby
44 lines
1.2 KiB
Ruby
# frozen_string_literal: true
|
|
|
|
class CrewGwParticipation < ApplicationRecord
|
|
belongs_to :crew
|
|
belongs_to :gw_event
|
|
|
|
has_many :gw_crew_scores, dependent: :destroy
|
|
has_many :gw_individual_scores, dependent: :destroy
|
|
|
|
validates :crew_id, uniqueness: { scope: :gw_event_id, message: 'is already participating in this event' }
|
|
|
|
# Get total crew score across all rounds (from crew battles)
|
|
def total_crew_score
|
|
gw_crew_scores.sum(:crew_score)
|
|
end
|
|
|
|
# Get total individual honors (sum of all member scores)
|
|
def total_individual_honors
|
|
gw_individual_scores.sum(:score)
|
|
end
|
|
|
|
# Get wins count
|
|
def wins_count
|
|
gw_crew_scores.where(victory: true).count
|
|
end
|
|
|
|
# Get losses count
|
|
def losses_count
|
|
gw_crew_scores.where(victory: false).count
|
|
end
|
|
|
|
# Get individual scores for a specific round
|
|
def individual_scores_for_round(round)
|
|
gw_individual_scores.where(round: round).includes(:crew_membership)
|
|
end
|
|
|
|
# Get leaderboard - members ranked by total score
|
|
def leaderboard
|
|
gw_individual_scores
|
|
.select('crew_membership_id, SUM(score) as total_score')
|
|
.group(:crew_membership_id)
|
|
.order('total_score DESC')
|
|
end
|
|
end
|