Files
aperonight/app/models/event.rb
Kevin BATAILLE a8a8c55041 working on header
2025-08-28 14:27:06 +02:00

52 lines
2.0 KiB
Ruby
Executable File

# Event model representing nightlife events and events
# Manages event details, location data, and publication state
class Event < ApplicationRecord
# Define states for Event lifecycle management
# draft: Initial state when Event is being created
# published: Event is visible to public and can be discovered
# canceled: Event has been canceled by organizer
# sold_out: Event has reached capacity and tickets are no longer available
enum :state, {
draft: 0,
published: 1,
canceled: 2,
sold_out: 3
}, default: :draft
# === Relations ===
belongs_to :user
has_many :ticket_types, dependent: :destroy
has_many :tickets, through: :ticket_types
# Validations for Event attributes
# Basic information
validates :name, presence: true, length: { minimum: 3, maximum: 100 }
validates :slug, presence: true, length: { minimum: 3, maximum: 100 }
validates :description, presence: true, length: { minimum: 10, maximum: 1000 }
validates :state, presence: true, inclusion: { in: states.keys }
validates :image, length: { maximum: 500 } # URL or path to image
# Venue information
validates :venue_name, presence: true, length: { maximum: 100 }
validates :venue_address, presence: true, length: { maximum: 200 }
# Geographic coordinates for map display
validates :latitude, presence: true, numericality: {
greater_than_or_equal_to: -90,
less_than_or_equal_to: 90
}
validates :longitude, presence: true, numericality: {
greater_than_or_equal_to: -180,
less_than_or_equal_to: 180
}
# Scopes for querying events with common filters
scope :featured, -> { where(featured: true) } # Get featured events for homepage
scope :published, -> { where(state: :published) } # Get publicly visible events
scope :search_by_name, ->(query) { where("name ILIKE ?", "%#{query}%") } # Search by name (case-insensitive)
# Scope for published events ordered by start time
scope :upcoming, -> { published.where("start_time >= ?", Time.current).order(start_time: :asc) }
end