- crews table with name, gamertag, granblue_crew_id, description - crew_memberships with role enum (member/vice_captain/captain) - partial unique index ensures one active crew per user - updated User model with crew associations and helper methods
48 lines
1.3 KiB
Ruby
48 lines
1.3 KiB
Ruby
# frozen_string_literal: true
|
|
|
|
class CrewMembership < ApplicationRecord
|
|
belongs_to :crew
|
|
belongs_to :user
|
|
|
|
enum :role, { member: 0, vice_captain: 1, captain: 2 }
|
|
|
|
validates :user_id, uniqueness: { scope: :crew_id }
|
|
validate :one_active_crew_per_user, on: :create
|
|
validate :captain_limit
|
|
validate :vice_captain_limit
|
|
|
|
scope :active, -> { where(retired: false) }
|
|
scope :retired, -> { where(retired: true) }
|
|
|
|
def retire!
|
|
update!(retired: true, retired_at: Time.current, role: :member)
|
|
end
|
|
|
|
def blueprint
|
|
CrewMembershipBlueprint
|
|
end
|
|
|
|
private
|
|
|
|
def one_active_crew_per_user
|
|
return if retired
|
|
|
|
if CrewMembership.where(user_id: user_id, retired: false).where.not(id: id).exists?
|
|
errors.add(:user, 'can only be in one active crew')
|
|
end
|
|
end
|
|
|
|
def captain_limit
|
|
return unless captain? && !retired
|
|
|
|
existing = crew.crew_memberships.where(role: :captain, retired: false).where.not(id: id)
|
|
errors.add(:role, 'crew can only have one captain') if existing.exists?
|
|
end
|
|
|
|
def vice_captain_limit
|
|
return unless vice_captain? && !retired
|
|
|
|
existing = crew.crew_memberships.where(role: :vice_captain, retired: false).where.not(id: id)
|
|
errors.add(:role, 'crew can only have up to 3 vice captains') if existing.count >= 3
|
|
end
|
|
end
|