mirror of
https://github.com/ryankazokas/turbovault-app.git
synced 2026-04-16 23:22:53 +00:00
Moving to github
This commit is contained in:
66
app/models/game.rb
Normal file
66
app/models/game.rb
Normal file
@@ -0,0 +1,66 @@
|
||||
class Game < ApplicationRecord
|
||||
# Associations
|
||||
belongs_to :user
|
||||
belongs_to :platform
|
||||
has_many :game_genres, dependent: :destroy
|
||||
has_many :genres, through: :game_genres
|
||||
has_many :collection_games, dependent: :destroy
|
||||
has_many :collections, through: :collection_games
|
||||
has_many :igdb_match_suggestions, dependent: :destroy
|
||||
belongs_to :igdb_game, foreign_key: :igdb_id, primary_key: :igdb_id, optional: true
|
||||
|
||||
# Enums
|
||||
enum :format, { physical: "physical", digital: "digital" }
|
||||
enum :completion_status, {
|
||||
backlog: "backlog",
|
||||
currently_playing: "currently_playing",
|
||||
completed: "completed",
|
||||
on_hold: "on_hold",
|
||||
not_playing: "not_playing"
|
||||
}, prefix: true
|
||||
|
||||
enum :condition, {
|
||||
cib: "cib", # Complete in Box
|
||||
loose: "loose",
|
||||
sealed: "sealed",
|
||||
good: "good",
|
||||
fair: "fair"
|
||||
}, prefix: true
|
||||
|
||||
# Validations
|
||||
validates :title, presence: true
|
||||
validates :format, presence: true
|
||||
validates :date_added, presence: true
|
||||
validates :user_rating, inclusion: { in: 1..5, message: "must be between 1 and 5" }, allow_nil: true
|
||||
validates :condition, presence: true, if: :physical?
|
||||
validates :digital_store, presence: true, if: :digital?
|
||||
|
||||
# Callbacks
|
||||
before_validation :set_date_added, on: :create
|
||||
|
||||
# Scopes
|
||||
scope :physical_games, -> { where(format: "physical") }
|
||||
scope :digital_games, -> { where(format: "digital") }
|
||||
scope :currently_playing, -> { where(completion_status: "currently_playing") }
|
||||
scope :completed, -> { where(completion_status: "completed") }
|
||||
scope :backlog, -> { where(completion_status: "backlog") }
|
||||
scope :by_platform, ->(platform_id) { where(platform_id: platform_id) }
|
||||
scope :by_genre, ->(genre_id) { joins(:genres).where(genres: { id: genre_id }) }
|
||||
scope :recent, -> { order(date_added: :desc) }
|
||||
scope :alphabetical, -> { order(:title) }
|
||||
scope :rated, -> { where.not(user_rating: nil).order(user_rating: :desc) }
|
||||
scope :igdb_matched, -> { where.not(igdb_id: nil) }
|
||||
scope :igdb_unmatched, -> { where(igdb_id: nil) }
|
||||
scope :needs_igdb_review, -> { joins(:igdb_match_suggestions).where(igdb_match_suggestions: { status: "pending" }).distinct }
|
||||
|
||||
# Class methods
|
||||
def self.search(query)
|
||||
where("title ILIKE ?", "%#{sanitize_sql_like(query)}%")
|
||||
end
|
||||
|
||||
private
|
||||
|
||||
def set_date_added
|
||||
self.date_added ||= Date.current
|
||||
end
|
||||
end
|
||||
Reference in New Issue
Block a user