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