hensei-api/app/models/crew_membership.rb
Justin Edmund 9b01aa0ff3 add crew and crew_membership models with migrations
- 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
2025-12-03 22:41:19 -08:00

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