0

我有一个Match模型和一个Team模型。

我想计算一个球队在联赛中的进球数(所以我必须将该球队的所有分数相加,在home_matchesaway_matches 中)。

我怎样才能做到这一点?我应该将哪些列放入比赛团队数据库表中?

4

2 回答 2

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_countgoal_count_cache_league

于 2012-12-25T15:33:47.413 回答
-1

你不要把它放在任何桌子上。数据库有一条规则:永远不要在数据库中存储可以从其他字段计算的数据。

您可以使用此函数轻松计算:

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

那应该为你做。如果您想为联赛过滤数学,您可以使用 a scope

于 2012-12-25T14:09:23.097 回答