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
для этого.