If Statement not working as intended?

i am having a problem with the if statement here. i know which team won the toss and what they elected to do.

i have check the values/equations in the console and it works, but when the data is saved it always save only bat_1 and and field_2

one note: when i swapped toss_won and toss_lost with test numbers everything runs fine???

    @game = Game.new(params[:game])     # select which teams batted and fielded first and second

    #make a copy of @team which is an array [["Rangers", 27], ["Red Sox", 29]]     check_teams = @teams

    say toss_won = 29 as an example     toss_won = params[:toss_won]

    #delete the team that won the toss, this removes the array set of the team that lost the toss     check_teams.delete_if { |a| [*a].include?(toss_won) }

    #this gets the number from the array check_teams which is now like [["Rangers", 27]]     toss_lost = check_teams[0][1]

   #check to see what the team the won the toss did, team 29 say elected to 'Bat' then     # put team numbers to bat first, bat second..     if params[:elected] == "Bat"       @game.bat_1 = toss_won       @game.bat_2 = toss_lost       @game.field_1 = toss_lost       @game.field_2 = toss_won     else       @game.bat_1 = toss_lost       @game.bat_2 = toss_won       @game.field_1 = toss_won       @game.field_2 = toss_lost     end

One possible source of confusion is the following:     #make a copy of @team which is an array [["Rangers", 27], ["Red Sox", 29]]     check_teams = @teams

The comment is _not_ accurate. Essentially what you've done is create a new pointer to the same object, not create a copy of it. As a result, everything that you do to check_team is also done to @teams. I don't know if that's effecting the results you're seeing but it's worth being aware of. If you actually want a completely separate copy of the exact same structure, you'd need check_teams = @teams.dup

Also, a note on your model. What is the purpose of having two sets of fields that are exactly the inverse of one another? That is, bat_1 is always field_2 and vice versa. That could become an expensive redundancy.

You might want to do this as well:

check_teams.delete_if { |a| [*a].include?(toss_won) } .flatten => ["Rangers", 27]

Similarly, toss_lost = check_teams.delete_if { |a| [*a].include? (toss_won) } .flatten,last => 27

@game.bat_1 = params[:elected]=="Bat" ? toss_won : toss_lost @game.bat_2 = params[:elected]=="Bat" ? toss_lost : toss_won @game.field_1, @game.field_2 = @game.bat_2, @game.bat_1

andy thanks for taking the time. i did solve this and i will make my notes below because there is still some confusion. i am glad that i was able to figure out the problem.

One possible source of confusion is the following: #make a copy of @team which is an array [["Rangers", 27], ["Red Sox", 29]] check_teams = @teams

The comment is _not_ accurate. Essentially what you've done is create a new pointer to the same object, not create a copy of it.

yes, i realize that, that was put in while i was testing the code, it's not necessary.

Also, a note on your model. What is the purpose of having two sets of fields that are exactly the inverse of one another? That is, bat_1 is always field_2 and vice versa. That could become an expensive redundancy.

thanks for pointing this out. i agree.

You might want to do this as well:

the previous logic was working, the problem was with

toss_won = params[:toss_won] for some reason this didn't work, but when i changed it to.

toss_won = @game.toss_won it worked @game was simply @game = Game.new(params[:game])

check_teams.delete_if { |a| [*a].include?(toss_won) } .flatten => ["Rangers", 27]

i really like the code below, thanks.