44 lines
1.2 KiB
Ruby
44 lines
1.2 KiB
Ruby
class Match < ApplicationRecord
|
|
belongs_to :player1, class_name: "User"
|
|
belongs_to :player2, class_name: "User"
|
|
|
|
enum :status, {
|
|
ongoing: 0,
|
|
player1_won: 1,
|
|
player2_won: 2,
|
|
draw: 3,
|
|
abandoned: 4
|
|
}
|
|
|
|
before_validation :assign_uuid, on: :create
|
|
|
|
validates :uuid, presence: true, uniqueness: true
|
|
validates :status, presence: true
|
|
validates :game_server, presence: true
|
|
validates :started_at, presence: true
|
|
validates :duration_seconds, numericality: { only_integer: true, greater_than_or_equal_to: 0 }, allow_nil: true
|
|
validates :player1_rating_before, :player2_rating_before,
|
|
presence: true, numericality: { only_integer: true }
|
|
validates :player1_rating_change, :player2_rating_change,
|
|
presence: true, numericality: { only_integer: true }
|
|
validate :players_must_differ
|
|
|
|
scope :finished, -> { where.not(finished_at: nil) }
|
|
scope :for_user, ->(user_or_id) {
|
|
id = user_or_id.is_a?(User) ? user_or_id.id : user_or_id
|
|
where(player1_id: id).or(where(player2_id: id))
|
|
}
|
|
|
|
private
|
|
|
|
def assign_uuid
|
|
self.uuid ||= SecureRandom.uuid
|
|
end
|
|
|
|
def players_must_differ
|
|
if player1_id.present? && player1_id == player2_id
|
|
errors.add(:player2, "must differ from player1")
|
|
end
|
|
end
|
|
end
|