From 4bc96847f621c4cb3940fe99b3b4b67b20596189 Mon Sep 17 00:00:00 2001 From: Kelly Rauchenberger Date: Tue, 3 Oct 2017 16:18:46 -0400 Subject: Removed box model It seemed kind of strange to have a model that there should always be exactly 14 of for each of the parent (Trainer) model instances, so the box names were moved into the Trainer model, and the Box model was removed. This commit also adds some eager loading to speed up page loading times. Also made a small change to the way the gift ribbons are extracted. refs #2 --- app/jobs/pokeviewer/extract_save_data_job.rb | 41 +++++++---- app/models/pokeviewer/box.rb | 29 -------- app/models/pokeviewer/pokemon.rb | 33 +++++++-- app/models/pokeviewer/trainer.rb | 58 +++++++++++++-- app/views/pokeviewer/pokemon/index.html.haml | 4 +- db/migrate/20171003191205_remove_boxes.rb | 106 +++++++++++++++++++++++++++ test/dummy/db/schema.rb | 26 ++++--- 7 files changed, 229 insertions(+), 68 deletions(-) delete mode 100644 app/models/pokeviewer/box.rb create mode 100644 db/migrate/20171003191205_remove_boxes.rb diff --git a/app/jobs/pokeviewer/extract_save_data_job.rb b/app/jobs/pokeviewer/extract_save_data_job.rb index 99d71f1..14ba9a6 100644 --- a/app/jobs/pokeviewer/extract_save_data_job.rb +++ b/app/jobs/pokeviewer/extract_save_data_job.rb @@ -3,7 +3,7 @@ module Pokeviewer queue_as :default def perform(args) - game = Trainer.find_or_create_by!( + game = Trainer.find_or_initialize_by( name: args["playerName"], number: args["playerId"]) do |r| case args["gameId"].to_i @@ -22,41 +22,50 @@ module Pokeviewer end end + game.box_1_name = args["boxes"].shift + game.box_2_name = args["boxes"].shift + game.box_3_name = args["boxes"].shift + game.box_4_name = args["boxes"].shift + game.box_5_name = args["boxes"].shift + game.box_6_name = args["boxes"].shift + game.box_7_name = args["boxes"].shift + game.box_8_name = args["boxes"].shift + game.box_9_name = args["boxes"].shift + game.box_10_name = args["boxes"].shift + game.box_11_name = args["boxes"].shift + game.box_12_name = args["boxes"].shift + game.box_13_name = args["boxes"].shift + game.box_14_name = args["boxes"].shift + if args.key? "marineRibbon" - game.marine_ribbon = GiftRibbon.find_by_id(args["marineRibbon"]) + game.marine_ribbon_id = args["marineRibbon"] end if args.key? "landRibbon" - game.land_ribbon = GiftRibbon.find_by_id(args["landRibbon"]) + game.land_ribbon_id = args["landRibbon"] end if args.key? "skyRibbon" - game.sky_ribbon = GiftRibbon.find_by_id(args["skyRibbon"]) + game.sky_ribbon_id = args["skyRibbon"] end if args.key? "countryRibbon" - game.country_ribbon = GiftRibbon.find_by_id(args["countryRibbon"]) + game.country_ribbon_id = args["countryRibbon"] end if args.key? "nationalRibbon" - game.national_ribbon = GiftRibbon.find_by_id(args["nationalRibbon"]) + game.national_ribbon_id = args["nationalRibbon"] end if args.key? "earthRibbon" - game.earth_ribbon = GiftRibbon.find_by_id(args["earthRibbon"]) + game.earth_ribbon_id = args["earthRibbon"] end if args.key? "worldRibbon" - game.world_ribbon = GiftRibbon.find_by_id(args["worldRibbon"]) + game.world_ribbon_id = args["worldRibbon"] end - game.save! if game.changed? - - args["boxes"].each_with_index do |box_name,index| - box = Box.find_or_initialize_by(trainer: game, number: index) - box.name = box_name - box.save! - end + game.save! if game.new_record? or game.changed? game.pokemon.clear @@ -97,7 +106,7 @@ module Pokeviewer if param["storage"] == "party" pk.box = nil elsif param["storage"] == "box" - pk.box = param["box"] + pk.box = param["box"] + 1 end pk.slot = param["slot"] diff --git a/app/models/pokeviewer/box.rb b/app/models/pokeviewer/box.rb deleted file mode 100644 index 090175e..0000000 --- a/app/models/pokeviewer/box.rb +++ /dev/null @@ -1,29 +0,0 @@ -module Pokeviewer - class Box < ApplicationRecord - belongs_to :trainer - - validates :name, presence: true - - validates :number, presence: true, - numericality: { - greater_than_or_equal_to: 0, - less_than: 14, - only_integer: true }, - uniqueness: { scope: :trainer_id } - - def contents - pokes = trainer.pokemon.where(box: number).order("slot ASC").to_a - - result = [] - (0..29).each do |i| - if pokes.empty? or (pokes.first.slot == i) - result << pokes.shift - else - result << nil - end - end - - result - end - end -end diff --git a/app/models/pokeviewer/pokemon.rb b/app/models/pokeviewer/pokemon.rb index 9f0b4af..3818f58 100644 --- a/app/models/pokeviewer/pokemon.rb +++ b/app/models/pokeviewer/pokemon.rb @@ -3,9 +3,36 @@ module Pokeviewer extend Enumerize belongs_to :species - belongs_to :trainer, optional: true + has_many :revisions, -> { order "sequential_id ASC" }, dependent: :destroy + belongs_to :trainer, optional: true + + validates :box, numericality: { + greater_than_or_equal_to: 1, + less_than_or_equal_to: 14, + only_integer: true }, + allow_nil: true + + validates :slot, presence: true, + uniqueness: { scope: [:trainer_id, :box] }, + numericality: { + greater_than_or_equal_to: 0, + only_integer: true }, + unless: Proc.new { |a| a.trainer_id.nil? } + + validates :slot, + numericality: { less_than: 30 }, + unless: Proc.new { |a| a.trainer_id.nil? or a.box.nil? } + + validates :slot, + numericality: { less_than: 6 }, + unless: Proc.new { |a| a.trainer_id.nil? or not a.box.nil? } + + scope :party, -> { where(box: nil) } + scope :box, ->(n) { where(box: n) } + scope :unaccounted, -> { where(trainer_id: nil) } + validate :uuid_is_constant, on: :update before_create :set_uuid @@ -41,10 +68,6 @@ module Pokeviewer :l, :m, :n, :o, :p, :q, :r, :s, :t, :u, :v, :w, :x, :y, :z, :question, :exclamation] - validates :slot, presence: true, - uniqueness: { scope: [:trainer_id, :box] }, - unless: Proc.new { |a| a.trainer.nil? } - def to_param uuid end diff --git a/app/models/pokeviewer/trainer.rb b/app/models/pokeviewer/trainer.rb index 7862c1e..b79547d 100644 --- a/app/models/pokeviewer/trainer.rb +++ b/app/models/pokeviewer/trainer.rb @@ -3,7 +3,6 @@ module Pokeviewer extend Enumerize has_many :pokemon, dependent: :nullify - has_many :boxes, -> { order("number ASC") }, dependent: :destroy validates :number, presence: true, numericality: { greater_than_or_equal_to: 0, only_integer: true } @@ -24,12 +23,61 @@ module Pokeviewer belongs_to :earth_ribbon, class_name: "GiftRibbon", optional: true belongs_to :world_ribbon, class_name: "GiftRibbon", optional: true - def display_number - number.to_s.rjust(5, '0') - end + validates :box_1_name, presence: true + validates :box_2_name, presence: true + validates :box_3_name, presence: true + validates :box_4_name, presence: true + validates :box_5_name, presence: true + validates :box_6_name, presence: true + validates :box_7_name, presence: true + validates :box_8_name, presence: true + validates :box_9_name, presence: true + validates :box_10_name, presence: true + validates :box_11_name, presence: true + validates :box_12_name, presence: true + validates :box_13_name, presence: true + validates :box_14_name, presence: true def party - pokemon.where(box: nil).order("slot ASC") + pokemon.party.includes(:species, :revisions) + end + + def box(n) + pokemon.box(n).includes(:species, :revisions) + end + + def box_name(n) + if n > 0 and n <= 14 + send "box_#{n}_name".intern + else + nil + end + end + + def box_contents(n) + pokes = box(n).to_a + + result = [] + (0..29).each do |i| + if pokes.empty? or (pokes.first.slot == i) + result << pokes.shift + else + result << nil + end + end + + result + end + + def boxes + (1..14).map { |n| { + name: box_name(n), + pokemon: box_contents(n) + }} + end + + def display_number + number.to_s.rjust(5, '0') end def gift_ribbon_description(ribbon) diff --git a/app/views/pokeviewer/pokemon/index.html.haml b/app/views/pokeviewer/pokemon/index.html.haml index f16f0bc..0be3edd 100644 --- a/app/views/pokeviewer/pokemon/index.html.haml +++ b/app/views/pokeviewer/pokemon/index.html.haml @@ -12,9 +12,9 @@ %span.party-name= link_to p.revisions.last.nickname, p - trainer.boxes.each do |box| .pc-box - %h3= box.name + %h3= box[:name] %table.pc-contents - - box.contents.each_slice(6) do |row| + - box[:pokemon].each_slice(6) do |row| %tr - row.each do |p| %td.pc-pokemon.pkv-has-hover diff --git a/db/migrate/20171003191205_remove_boxes.rb b/db/migrate/20171003191205_remove_boxes.rb new file mode 100644 index 0000000..476b98a --- /dev/null +++ b/db/migrate/20171003191205_remove_boxes.rb @@ -0,0 +1,106 @@ +class RemoveBoxes < ActiveRecord::Migration[5.1] + def up + change_table :pokeviewer_trainers do |t| + t.string :box_1_name, null: false, default: "" + t.string :box_2_name, null: false, default: "" + t.string :box_3_name, null: false, default: "" + t.string :box_4_name, null: false, default: "" + t.string :box_5_name, null: false, default: "" + t.string :box_6_name, null: false, default: "" + t.string :box_7_name, null: false, default: "" + t.string :box_8_name, null: false, default: "" + t.string :box_9_name, null: false, default: "" + t.string :box_10_name, null: false, default: "" + t.string :box_11_name, null: false, default: "" + t.string :box_12_name, null: false, default: "" + t.string :box_13_name, null: false, default: "" + t.string :box_14_name, null: false, default: "" + end + + change_column_default :pokeviewer_trainers, :box_1_name, nil + change_column_default :pokeviewer_trainers, :box_2_name, nil + change_column_default :pokeviewer_trainers, :box_3_name, nil + change_column_default :pokeviewer_trainers, :box_4_name, nil + change_column_default :pokeviewer_trainers, :box_5_name, nil + change_column_default :pokeviewer_trainers, :box_6_name, nil + change_column_default :pokeviewer_trainers, :box_7_name, nil + change_column_default :pokeviewer_trainers, :box_8_name, nil + change_column_default :pokeviewer_trainers, :box_9_name, nil + change_column_default :pokeviewer_trainers, :box_10_name, nil + change_column_default :pokeviewer_trainers, :box_11_name, nil + change_column_default :pokeviewer_trainers, :box_12_name, nil + change_column_default :pokeviewer_trainers, :box_13_name, nil + change_column_default :pokeviewer_trainers, :box_14_name, nil + + Pokeviewer::Trainer.all.each do |t| + boxes = ActiveRecord::Base.connection.select_all( + "SELECT * FROM pokeviewer_boxes WHERE trainer_id = ? ORDER BY number ASC", + t.trainer_id).map { |b| b["name"] } + + t.box_1_name = boxes.shift + t.box_2_name = boxes.shift + t.box_3_name = boxes.shift + t.box_4_name = boxes.shift + t.box_5_name = boxes.shift + t.box_6_name = boxes.shift + t.box_7_name = boxes.shift + t.box_8_name = boxes.shift + t.box_9_name = boxes.shift + t.box_10_name = boxes.shift + t.box_11_name = boxes.shift + t.box_12_name = boxes.shift + t.box_13_name = boxes.shift + t.box_14_name = boxes.shift + + t.save + end + + drop_table :pokeviewer_boxes + end + + def down + create_table :pokeviewer_boxes do |t| + t.integer "trainer_id", null: false + t.integer "number", null: false + t.string "name", null: false + + t.timestamps + end + + add_index :pokeviewer_boxes, [:trainer_id, :number], unique: true + + add_foreign_key :pokeviewer_boxes, :pokeviewer_trainers, column: :trainer_id + + Pokeviewer::Trainer.all.each do |t| + Pokeviewer::Box.create(trainer_id: t.trainer_id, number: 1, name: t.box_1_name) + Pokeviewer::Box.create(trainer_id: t.trainer_id, number: 2, name: t.box_2_name) + Pokeviewer::Box.create(trainer_id: t.trainer_id, number: 3, name: t.box_3_name) + Pokeviewer::Box.create(trainer_id: t.trainer_id, number: 4, name: t.box_4_name) + Pokeviewer::Box.create(trainer_id: t.trainer_id, number: 5, name: t.box_5_name) + Pokeviewer::Box.create(trainer_id: t.trainer_id, number: 6, name: t.box_6_name) + Pokeviewer::Box.create(trainer_id: t.trainer_id, number: 7, name: t.box_7_name) + Pokeviewer::Box.create(trainer_id: t.trainer_id, number: 8, name: t.box_8_name) + Pokeviewer::Box.create(trainer_id: t.trainer_id, number: 9, name: t.box_9_name) + Pokeviewer::Box.create(trainer_id: t.trainer_id, number: 10, name: t.box_10_name) + Pokeviewer::Box.create(trainer_id: t.trainer_id, number: 11, name: t.box_11_name) + Pokeviewer::Box.create(trainer_id: t.trainer_id, number: 12, name: t.box_12_name) + Pokeviewer::Box.create(trainer_id: t.trainer_id, number: 13, name: t.box_13_name) + Pokeviewer::Box.create(trainer_id: t.trainer_id, number: 14, name: t.box_14_name) + end + + remove_column :pokeviewer_trainers, :box_1_name + remove_column :pokeviewer_trainers, :box_2_name + remove_column :pokeviewer_trainers, :box_3_name + remove_column :pokeviewer_trainers, :box_4_name + remove_column :pokeviewer_trainers, :box_5_name + remove_column :pokeviewer_trainers, :box_6_name + remove_column :pokeviewer_trainers, :box_7_name + remove_column :pokeviewer_trainers, :box_8_name + remove_column :pokeviewer_trainers, :box_9_name + remove_column :pokeviewer_trainers, :box_10_name + remove_column :pokeviewer_trainers, :box_11_name + remove_column :pokeviewer_trainers, :box_12_name + remove_column :pokeviewer_trainers, :box_13_name + remove_column :pokeviewer_trainers, :box_14_name + end +end diff --git a/test/dummy/db/schema.rb b/test/dummy/db/schema.rb index 87db1f8..b1c02e3 100644 --- a/test/dummy/db/schema.rb +++ b/test/dummy/db/schema.rb @@ -10,17 +10,7 @@ # # It's strongly recommended that you check this file into your version control system. -ActiveRecord::Schema.define(version: 20171003154157) do - - create_table "pokeviewer_boxes", force: :cascade do |t| - t.integer "trainer_id", null: false - t.integer "number", null: false - t.string "name", null: false - t.datetime "created_at", null: false - t.datetime "updated_at", null: false - t.index ["trainer_id", "number"], name: "index_pokeviewer_boxes_on_trainer_id_and_number", unique: true - t.index ["trainer_id"], name: "index_pokeviewer_boxes_on_trainer_id" - end +ActiveRecord::Schema.define(version: 20171003191205) do create_table "pokeviewer_gift_ribbons", force: :cascade do |t| t.string "description", null: false @@ -158,6 +148,20 @@ ActiveRecord::Schema.define(version: 20171003154157) do t.integer "national_ribbon_id" t.integer "earth_ribbon_id" t.integer "world_ribbon_id" + t.string "box_1_name", null: false + t.string "box_2_name", null: false + t.string "box_3_name", null: false + t.string "box_4_name", null: false + t.string "box_5_name", null: false + t.string "box_6_name", null: false + t.string "box_7_name", null: false + t.string "box_8_name", null: false + t.string "box_9_name", null: false + t.string "box_10_name", null: false + t.string "box_11_name", null: false + t.string "box_12_name", null: false + t.string "box_13_name", null: false + t.string "box_14_name", null: false t.index ["country_ribbon_id"], name: "index_pokeviewer_trainers_on_country_ribbon_id" t.index ["earth_ribbon_id"], name: "index_pokeviewer_trainers_on_earth_ribbon_id" t.index ["land_ribbon_id"], name: "index_pokeviewer_trainers_on_land_ribbon_id" -- cgit 1.4.1