2014-01-07 2 views
0

Я создаю приложение статистики бейсбола. У меня возникли проблемы с тем, чтобы игры были разделены на сезоны.Группировка игр по сезонам по году

Игра содержит битвы, качки и полевые игры. В игре также есть поле play_date, из которого я могу получить год.

В принципе, я хочу, чтобы иметь возможность разделить игры на сезоны и добавить столбцы в течение этого сезона.

Например, быть в состоянии сделать:

<% @player.each do |player| %> 
    <% player.battings.seasons.each do |battingseason| %> 
     <%= battingseason.total("homeruns") %> 
    <% end %> 
<% end %> 

Так «battingseason.total (» homeruns «)» будет суммировать общий homeruns, что конкретный игрок ударил в этом сезоне.

Я был в состоянии получить годы, какие игры играли через это:

@game_seasons = @games.group_by { |g| g.played_date.beginning_of_year } 

... но я не уверен, что это так много помощи.

Оттуда, я также должен иметь возможность разделить сезоны на падение и весну. Например, что я в настоящее время:

def season 
    if self.game.played_date.month >= 9 && self.game.played_date.month <= 12 
     season = "fall" 
    else 
     season = "spring" 
    end 
end 

Так что моя проблема в том, что я просто не знаю, куда девать всю эту логику в контроллере, в модели? И как именно вывести его, спасибо!

ответ

0

Я бы создал модель Season. Модель сезона имеет одну колонку, season. Я хотел бы настроить эти модели таким образом:

class Season < ActiveRecord::Base 
    has_many :games 
    has_many :battings, through: :games 
    has_many :pitchings, through: :games 
    has_many :fieldings, through: :games 
end 

class Game < ActiveRecord::Base 
    belongs_to :season 
end 

Вы должны были бы добавить season_id к games столу, и вы можете добавить метод before_validate в game модели:

before_validate :find_or_create_season 

private 

def find_or_create_season 
    if self.played_date.month >= 9 && self.played_date.month <= 12 
    season = "fall" 
    else 
    season = "spring" 
    end 
    season_name = season + ' ' + self.played_date.year.to_s 
    game_season = Season.find_or_create_by_season(season_name) 
    self.season_id = game_season.id 
end 

Я не знаю, как вам хотите, чтобы ваше представление выглядело, но это одна из возможностей. Это даст вам резюме для одного игрока на сезон для homeruns:

В контроллере:

def show 
    @player = Player.find(params[:id]) 

    #not sure how you define if a batting was a homerun. I assumed that you have a boolean for that 
    @homeruns_by_season = @player.battings.where('homerun = ?', true).group(:season).count 
    #this will return a hash with season as a key and the count as the value 

end 

По вашему мнению

<% @homeruns_by_season.each do |season, homeruns| %> 
    <td><%= season.season %></td> 
    <td><%= homeruns %></td> 
<% end %> 
+0

Так ли это требуется создание новой таблицы, или просто новая модель и новый столбец в таблице игр. Кроме того, какие теги представлений выводят именно то, что я хочу, как в примере в вопросе. И делает ли это суммирование для каждого столбца внутри биттов, качки и полевых работ? Спасибо! –

+0

Да, вам понадобится новый стол 'сезонов' и ​​новый столбец' season_id' в таблице 'games'. Я буду обновлять свой ответ, чтобы включить код 'view'. Вы пытаетесь обобщить homeruns игроками или к сезону в первую очередь. Я имею в виду, вы хотите сначала подытожить homeruns игроком, а потом - сезон или наоборот? – AbM

+0

Итак, есть игры, которые играли в 2012 и 2013 годах. Джон Доу сыграл 20 игр в 2012 году, и у него было только две игры, в которых он попал в гомерину. В сезоне 2012 года Джон Доу поразил 2 homeruns. Так сезон, затем статистика в течение сезона. –

Смежные вопросы