Database modeling

I have a player model and a game model set up with a HABTM.

I am trying to keep track of statistics for a player based on a hits and misses, which the user marks when editing a game. When the game is done editing an email is sent to the other team to confirm the game. If it is confirmed the statistics should be updated on the site. Here's what I have:

def confirm_game   @games = Game.find(:all)    for game in @games       if (found the right game through hashing)         game.update_attribute(:confirmed, true)         game.update_statistics         flash[:notice] = "Thank you for validating the game."         break        end     end end

Game model def update_statistics     for team in self.teams       for player in team.players         player.update_statistics(self)       end       team.update_statistics       School.find(team.school_id).update_statistics     end   end

Player Model   def update_statistics(game)     for player in @game.players         self.update_attribute(:hit_percentage, (player.hit.to_f / (player.hit.to_f + player.misses.to_f)) * 100) unless player.misses == 0         self.update_attribute(:opp_percentage, player.points.to_f / (player.hit.to_f + player.misses.to_f)) unless player.misses == 0       end     end   end

  def add_hit     self.update_attribute(:hit, hit + 1)   end

I don't think this is the correct way to represent each hit a player has per game. How do I set it up like that? Also how do I write a view to show the game with each player's hits/ misses?

I am not sure that your present approach with respect to the data is sound. Generally, statistics are derived and updated from accumulated raw data. What might prove more beneficial in the long run is to simply store each player's raw performance. So, assuming baseball as the sport, one could store this information in the GamePlayer model.

Something like this (NOT TESTED)

class Player

  has_many :player_game_stats, :class_name => 'GamePlayer'   has_many :player_games, :class_name => 'GamePlayer', :include => :game   has_many :games, :through => :player_games

class Games

  has_many :game_players, :include => :player   has_many :line_ups, :class_name => 'GamePlayer'   has_many :players, :through => :game_players

class GamePlayer

  belongs_to :player   belongs_to :game

with model attributes / db columns:   player_id   game_id   position_played   innings_played   batting_order   at_bats   strike_outs   base_on-errors   walks   singles   doubles   triples   hr   rbi   ... and so forth.

Then you simply derive your statistics from the detailed records in player_games. This can be done at the DBMS level using stored procedures in many cases thus simplifying your application even further.