# Ride System Models Documentation ## Overview The rides system is implemented through a set of interconnected Eloquent models that handle different aspects of ride management. The implementation maintains feature parity with the Django original while leveraging Laravel's conventions and features. ## Model Structure ### RideModel - **Purpose**: Templates for specific ride types/products - **Key Features**: - Manufacturer relationship - Category type from RideCategory enum - Has many Rides - Full name accessor for manufacturer + model name - **File**: `app/Models/RideModel.php` ### Ride - **Purpose**: Individual ride installations at parks - **Key Features**: - Complex relationships to: - Park (required) - ParkArea (optional) - Manufacturer (optional) - Designer (optional) - RideModel (optional) - RollerCoasterStats (optional one-to-one) - Status tracking with dates - Automatic slug generation - Type safety through enums - **File**: `app/Models/Ride.php` ### RollerCoasterStats - **Purpose**: Extended statistics for roller coaster type rides - **Key Features**: - One-to-one relationship with Ride - Physical measurements with decimal precision - Track material and type enums - Train configuration tracking - Total seats calculation - **File**: `app/Models/RollerCoasterStats.php` ### Designer - **Purpose**: Track ride designers and their work - **Key Features**: - Basic information storage - Automatic slug generation - Has many relationship to rides - **File**: `app/Models/Designer.php` ## Key Design Decisions ### 1. Type Safety - Used PHP 8.1 enums for all constrained choices: - RideCategory - RideStatus - TrackMaterial - RollerCoasterType - LaunchType ### 2. Data Integrity - Proper foreign key constraints - Appropriate nullOnDelete vs cascadeOnDelete choices - Unique constraints where needed ### 3. Automatic Features - Slug generation on model creation - Proper cast declarations for: - Dates - Decimals - Enums - Integers ### 4. Optimization Choices - No timestamps on RollerCoasterStats (reduces overhead) - Appropriate indexes on foreign keys - Efficient relationships setup ### 5. Laravel Conventions - Followed naming conventions - Used protected properties for configurations - Proper method return type declarations - Relationship method naming ## Usage Examples ### Creating a New Ride ```php $ride = Ride::create([ 'name' => 'Thunderbolt', 'park_id' => $park->id, 'category' => RideCategory::ROLLER_COASTER, 'status' => RideStatus::OPERATING, ]); ``` ### Adding Roller Coaster Stats ```php $ride->coasterStats()->create([ 'height_ft' => 120.5, 'track_material' => TrackMaterial::STEEL, 'roller_coaster_type' => RollerCoasterType::SITDOWN, ]); ``` ### Getting Ride with All Relations ```php $ride = Ride::with([ 'park', 'parkArea', 'manufacturer', 'designer', 'rideModel', 'coasterStats', ])->find($id); ``` ## Relationship Maps ### RideModel - ← belongs to → Manufacturer - ← has many → Ride ### Ride - ← belongs to → Park - ← belongs to → ParkArea - ← belongs to → Manufacturer - ← belongs to → Designer - ← belongs to → RideModel - ← has one → RollerCoasterStats ### RollerCoasterStats - ← belongs to → Ride ### Designer - ← has many → Ride ## Future Enhancements 1. Add review relationships 2. Implement photo relationships 3. Add history tracking 4. Consider adding composite indexes for common queries