STILL trying to get tournament rounds filled in correctly. Wholly freaking ActiveRecord.

This commit is contained in:
Dan Buch 2012-03-10 23:28:55 -05:00
parent 5cf5a8035d
commit 0b853163bf
6 changed files with 57 additions and 27 deletions

View File

@ -41,7 +41,7 @@ class MashTournamentsController < ApplicationController
) )
respond_to do |format| respond_to do |format|
if @mash_tournament.save && @mash_tournament.create_rounds if @mash_tournament.save && @mash_tournament.create_rounds_for_contenders(8)
flash[:notice] = "Let's start mashing!" flash[:notice] = "Let's start mashing!"
format.html { redirect_to :controller => 'mashes', :action => 'new' } format.html { redirect_to :controller => 'mashes', :action => 'new' }
else else

View File

@ -2,8 +2,6 @@ require 'fastercsv'
class Map < ActiveRecord::Base class Map < ActiveRecord::Base
belongs_to :mash, :class_name => 'Mash'
def self.from_city_name(city_name) def self.from_city_name(city_name)
self.find_or_initialize_by_name(city_name).save! self.find_or_initialize_by_name(city_name).save!
end end

View File

@ -1,9 +1,9 @@
class Mash < ActiveRecord::Base class Mash < ActiveRecord::Base
has_one :map_a, :class_name => 'Map' belongs_to :map_a, :class_name => 'Map'
has_one :map_b, :class_name => 'Map' belongs_to :map_b, :class_name => 'Map'
has_one :winner, :class_name => 'Map' belongs_to :winner, :class_name => 'Map'
belongs_to :tournament, :class_name => 'MashTournament' has_one :tournament, :class_name => 'MashTournament'
belongs_to :round, :class_name => 'MashTournamentRound' has_one :round, :class_name => 'MashTournamentRound'
named_scope :unplayed, { named_scope :unplayed, {
:conditions => %{ :conditions => %{

View File

@ -2,7 +2,6 @@ class MashTournament < ActiveRecord::Base
belongs_to :requester belongs_to :requester
has_many :mashes has_many :mashes
has_many :rounds, :class_name => 'MashTournamentRound' has_many :rounds, :class_name => 'MashTournamentRound'
#after_save :fill_in_next_round
def next_unplayed_mash def next_unplayed_mash
self.mashes.unplayed.first self.mashes.unplayed.first
@ -22,7 +21,7 @@ class MashTournament < ActiveRecord::Base
[8, 16, 32, 64, 128].include?(n_contenders) [8, 16, 32, 64, 128].include?(n_contenders)
end end
def create_rounds(n_contenders) def create_rounds_for_contenders(n_contenders)
if not valid_number_of_contenders?(n_contenders) if not valid_number_of_contenders?(n_contenders)
raise StandardError.new( raise StandardError.new(
"The number of contenders must be 8, 16, 32, 64, or 128! " + "The number of contenders must be 8, 16, 32, 64, or 128! " +
@ -42,10 +41,9 @@ class MashTournament < ActiveRecord::Base
end end
def fill_in_next_round def fill_in_next_round
self.rounds.sort(&:number).each do |round| self.rounds.sort{ |a,b| a.number <=> b.number}.each do |round|
if not round.done? if not round.done?
assign_maps_for_round(round) return assign_maps_for_round(round)
return
end end
end end
end end
@ -68,6 +66,10 @@ class MashTournament < ActiveRecord::Base
end end
def assign_maps_for_round(round) def assign_maps_for_round(round)
if round.number == 1
return assign_maps_for_round_one(round)
end
previous = MashTournamentRound.find_by_mash_tournament_id_and_number( previous = MashTournamentRound.find_by_mash_tournament_id_and_number(
self.id, round.number - 1 self.id, round.number - 1
) )
@ -77,16 +79,20 @@ class MashTournament < ActiveRecord::Base
:conditions => ['id in ?', previous_winners] :conditions => ['id in ?', previous_winners]
) )
filled_in = []
round.mashes.each do |mash| round.mashes.each do |mash|
mash.update_attributes( mash.map_a = pool.pop.id
:map_a_id => pool.pop.id, mash.map_b = pool.pop.id
:map_b_id => pool.pop.id mash.save!
)
end filled_in << mash
end end
def assign_maps_for_round_zero filled_in
round = MashTournamentRound.for_round(self.id, 0) end
def assign_maps_for_round_one(round)
pool = Map.all( pool = Map.all(
:order => 'RANDOM()', :order => 'RANDOM()',
:limit => round.mash_count * 2 :limit => round.mash_count * 2
@ -94,17 +100,21 @@ class MashTournament < ActiveRecord::Base
logger.info("Populating mashes from pool: #{pool.inspect}") logger.info("Populating mashes from pool: #{pool.inspect}")
filled_in = []
round.mashes.each do |mash| round.mashes.each do |mash|
map_a = pool.pop map_a = pool.pop
map_b = pool.pop map_b = pool.pop
logger.info("Assigning `map_a` from #{map_a.inspect}, " + logger.info("Assigning `map_a` from #{map_a.inspect}, " +
"`map_b` from #{map_b.inspect} to mash #{mash.inspect}") "`map_b` from #{map_b.inspect} to mash #{mash.inspect}")
logger.info("`map_a`.`id` = #{map_a.id}, `map_b`.`id` = #{map_b.id} ")
mash.update_attributes( mash.map_a = map_a
:map_a_id => map_a.id, mash.map_b = map_b
:map_b_id => map_b.id mash.save!
)
end filled_in << mash
end
filled_in
end end
end end

View File

@ -5,4 +5,12 @@ class MashTournamentRound < ActiveRecord::Base
def self.for_round(tournament, round_number) def self.for_round(tournament, round_number)
self.find_by_mash_tournament_id_and_number(tournament, round_number) self.find_by_mash_tournament_id_and_number(tournament, round_number)
end end
def done?
winners = []
self.mashes.collect do |mash|
winners << mash.winner_id
end
!winners.include?(nil)
end
end end

View File

@ -18,11 +18,10 @@ describe MashTournament do
end end
context 'creating rounds' do context 'creating rounds' do
it 'should reject invalid numbers of contenders' do it 'should reject invalid numbers of contenders' do
[11, 24, 40].each do |n| [11, 24, 40].each do |n|
expect do expect do
subject.create_rounds(n) subject.create_rounds_for_contenders(n)
end.to raise_error end.to raise_error
end end
end end
@ -37,10 +36,25 @@ describe MashTournament do
[[8, 3], [16, 4], [32, 5]].each do |n_contenders,n_rounds| [[8, 3], [16, 4], [32, 5]].each do |n_contenders,n_rounds|
context "for #{n_contenders} total contenders" do context "for #{n_contenders} total contenders" do
it "should create #{n_rounds} rounds" do it "should create #{n_rounds} rounds" do
subject.create_rounds(n_contenders) subject.create_rounds_for_contenders(n_contenders)
subject.total_rounds.should == n_rounds subject.total_rounds.should == n_rounds
end end
end end
end end
end end
context 'filling in rounds' do
before(:each) do
subject.id.should_not be_nil
subject.create_rounds_for_contenders(8)
end
xit 'should fill in every map for every mash in a given round' do
subject.fill_in_next_round
subject.round(1).mashes.each do |mash|
mash.map_a.should_not be_nil
mash.map_b.should_not be_nil
end
end
end
end end