From 38308f648319936046d59ec0c7c855ad975b68d7 Mon Sep 17 00:00:00 2001 From: Evan Burkey Date: Sat, 25 Jan 2025 17:37:01 -0800 Subject: [PATCH] alts --- app/controllers/leaderboard_controller.rb | 2 +- app/models/player.rb | 41 +++++++++++++++++++ app/views/leaderboard/index.html.erb | 14 +++---- ...126011348_add_main_player_id_to_players.rb | 6 +++ db/schema.rb | 4 +- db/seeds.rb | 9 ---- 6 files changed, 58 insertions(+), 18 deletions(-) create mode 100644 db/migrate/20250126011348_add_main_player_id_to_players.rb delete mode 100644 db/seeds.rb diff --git a/app/controllers/leaderboard_controller.rb b/app/controllers/leaderboard_controller.rb index 3ba0a06..2bdcd59 100644 --- a/app/controllers/leaderboard_controller.rb +++ b/app/controllers/leaderboard_controller.rb @@ -1,5 +1,5 @@ class LeaderboardController < ApplicationController def index - @players = Player.order(purse: :desc) + @players = Player.where(main_player_id: nil).order(purse: :desc) end end diff --git a/app/models/player.rb b/app/models/player.rb index 1bc55b4..04f1986 100644 --- a/app/models/player.rb +++ b/app/models/player.rb @@ -1,2 +1,43 @@ class Player < ApplicationRecord + # A Player can be an alt of another player (the main) + belongs_to :main_player, class_name: "Player", optional: true, foreign_key: "main_player_id" + + # A Player can have multiple alts + has_many :alternate_players, class_name: "Player", foreign_key: "main_player_id" + + validate :no_circular_references + + def total_wins + w = self.wins + alternate_players.each { |alt| + w += alt.wins + } + w + end + + def total_losses + l = self.losses + alternate_players.each { |alt| + l += alt.losses + } + l + end + + def total_purse + p = self.purse + alternate_players.each { |alt| + p += alt.purse + } + p + end + + def alt? + self.main_player + end + + def no_circular_references + if main_player_id.present? && (main_player.main_player== self) + errors.add(:main_account, "circular reference") + end + end end diff --git a/app/views/leaderboard/index.html.erb b/app/views/leaderboard/index.html.erb index 216ecc2..f997bec 100644 --- a/app/views/leaderboard/index.html.erb +++ b/app/views/leaderboard/index.html.erb @@ -1,19 +1,19 @@

Force Kin Gamba Leaderboard

+<% if @players.any? %>

Gambalord

<%= @players.first.name %>

-
<%= @players.first.purse %>
+
<%= @players.first.total_purse %>

Gumbalord

<%= @players.last.name %>

-
<%= @players.last.purse %>
+
<%= @players.last.total_purse %>
-<% if @players.any? %>
@@ -25,14 +25,14 @@ <% @players.each do |player| %>
<%= player.name %>
-
<%= player.purse %>
-
<%= player.wins %>
-
<%= player.losses %>
+
<%= player.total_purse %>
+
<%= player.total_wins %>
+
<%= player.total_losses %>
<% end %>
Game History
<% else %> -

No Players!

+

No Players!

<% end %> diff --git a/db/migrate/20250126011348_add_main_player_id_to_players.rb b/db/migrate/20250126011348_add_main_player_id_to_players.rb new file mode 100644 index 0000000..44c54db --- /dev/null +++ b/db/migrate/20250126011348_add_main_player_id_to_players.rb @@ -0,0 +1,6 @@ +class AddMainPlayerIdToPlayers < ActiveRecord::Migration[8.0] + def change + add_column :players, :main_player_id, :integer + add_index :players, :main_player_id + end +end diff --git a/db/schema.rb b/db/schema.rb index b8c7f3a..784a570 100644 --- a/db/schema.rb +++ b/db/schema.rb @@ -10,7 +10,7 @@ # # It's strongly recommended that you check this file into your version control system. -ActiveRecord::Schema[8.0].define(version: 2025_01_24_201602) do +ActiveRecord::Schema[8.0].define(version: 2025_01_26_011348) do create_table "api_keys", force: :cascade do |t| t.string "key" t.string "client" @@ -39,5 +39,7 @@ ActiveRecord::Schema[8.0].define(version: 2025_01_24_201602) do t.integer "purse" t.datetime "created_at", null: false t.datetime "updated_at", null: false + t.integer "main_player_id" + t.index ["main_player_id"], name: "index_players_on_main_player_id" end end diff --git a/db/seeds.rb b/db/seeds.rb deleted file mode 100644 index 4fbd6ed..0000000 --- a/db/seeds.rb +++ /dev/null @@ -1,9 +0,0 @@ -# This file should ensure the existence of records required to run the application in every environment (production, -# development, test). The code here should be idempotent so that it can be executed at any point in every environment. -# The data can then be loaded with the bin/rails db:seed command (or created alongside the database with db:setup). -# -# Example: -# -# ["Action", "Comedy", "Drama", "Horror"].each do |genre_name| -# MovieGenre.find_or_create_by!(name: genre_name) -# end