- 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
32 lines
944 B
Ruby
32 lines
944 B
Ruby
# frozen_string_literal: true
|
|
|
|
class Crew < ApplicationRecord
|
|
has_many :crew_memberships, dependent: :destroy
|
|
has_many :users, through: :crew_memberships
|
|
has_many :active_memberships, -> { where(retired: false) }, class_name: 'CrewMembership'
|
|
has_many :active_members, through: :active_memberships, source: :user
|
|
|
|
validates :name, presence: true, length: { maximum: 100 }
|
|
validates :gamertag, length: { maximum: 50 }, allow_nil: true
|
|
validates :granblue_crew_id, uniqueness: true, allow_nil: true
|
|
|
|
def captain
|
|
crew_memberships.find_by(role: :captain, retired: false)&.user
|
|
end
|
|
|
|
def vice_captains
|
|
crew_memberships.where(role: :vice_captain, retired: false).includes(:user).map(&:user)
|
|
end
|
|
|
|
def officers
|
|
crew_memberships.where(role: [:captain, :vice_captain], retired: false).includes(:user).map(&:user)
|
|
end
|
|
|
|
def member_count
|
|
active_memberships.count
|
|
end
|
|
|
|
def blueprint
|
|
CrewBlueprint
|
|
end
|
|
end
|