Ruby on Rails - Подсчет голов команды во многих матчах

У меня есть модель матча и модель команды.

Я хочу посчитать, сколько голов забивает команда в течение лиги (поэтому я должен суммировать все результаты этой команды, как в home_matches, так и в гостях).

Как я могу это сделать? Какие столбцы я должен поместить в таблицы базы данных матчей и команд?

2 ответа

Решение

Я бы предположил, что ваш Match Модель выглядит примерно так:

belongs_to :home_team, class_name:"Team"
belongs_to :away_team, class_name:"Team"

attr_accessible :home_goal_count, :away_goal_count

Если это так, вы можете добавить метод для извлечения количества голов:

def goal_count
    home_matches.sum(:home_goal_count) + away_matches.sum(:away_goal_count)
end

Так как это может быть дорого (особенно если вы делаете это часто), вы можете просто кэшировать это значение в модели команды и использовать after_save зацепить Match модель (и, если совпадения когда-либо удаляются, то after_destroy а также крюк)

after_save :update_team_goals

def update_team_goals
    home_team.update_attribute(:goal_count_cache, home_team.goal_count)
    away_team.update_attribute(:goal_count_cache, away_team.goal_count)
end

Поскольку вы хотите сделать это для лиг, вы, вероятно, хотите добавить belongs_to :league на Match модель, параметр лиги к goal_count метод (и его запрос), и goal_count_cache_league столбец, если вы хотите кешировать значение (только кеш, последний измененный с моей предложенной реализацией, но настраивайте при необходимости).

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

Вы можете легко рассчитать это, используя эту функцию:

def total_goals
  self.home_matches.collect(&:home_goals).inject(&:+)+self.away_matches.collect(&:away_goals).inject(&:+)
end

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

Другие вопросы по тегам