53 lines
1.2 KiB
Ruby
53 lines
1.2 KiB
Ruby
class GameParticipant < ApplicationRecord
|
|
belongs_to :game
|
|
belongs_to :user
|
|
|
|
validates :status, inclusion: { in: %w[joined ready finished] }
|
|
validates :user_id, uniqueness: { scope: :game_id }
|
|
validates :power, uniqueness: { scope: :game_id }, allow_nil: true
|
|
|
|
# ステータス管理メソッド
|
|
def joined?
|
|
status == 'joined'
|
|
end
|
|
|
|
def ready?
|
|
status == 'ready'
|
|
end
|
|
|
|
def finished?
|
|
status == 'finished'
|
|
end
|
|
|
|
# パワー選択関連
|
|
def has_selected_power?
|
|
power.present?
|
|
end
|
|
|
|
def select_power!(power_name)
|
|
update!(power: power_name, status: 'ready')
|
|
end
|
|
|
|
# ゲーム参加メソッド
|
|
class << self
|
|
def join_game!(game, user, password = nil)
|
|
# パスワードチェック(プレイヤーモードの場合)
|
|
if game.player_mode? && game.password.present?
|
|
raise "Invalid password" unless game.password == password
|
|
end
|
|
|
|
# 既存参加チェック
|
|
if game.game_participants.exists?(user_id: user.id)
|
|
raise "Already joined this game"
|
|
end
|
|
|
|
# 定員チェック
|
|
if game.player_mode? && game.full?
|
|
raise "Game is full"
|
|
end
|
|
|
|
create!(game: game, user: user, joined_at: Time.current, status: 'joined')
|
|
end
|
|
end
|
|
end
|