Ruby on Rails - 计算许多比赛中球队的目标

时间:2012-12-25 13:52:56

标签: ruby-on-rails database associations counting rails-models

我有匹配模型和团队模型。

我想要计算一支球队在联盟中得分的目标数(所以我必须在 home_matches away_matches )中总结该球队的所有得分。

我该怎么做?我应该在匹配团队数据库表中添加哪些列?

2 个答案:

答案 0 :(得分: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列(仅根据我建议的实施缓存最近更改的内容,但根据需要进行调整)。

答案 1 :(得分:-2)

你不要把它放在任何表格中。数据库的规则:不要在数据库中存储可以从其他字段计算的数据。

您可以使用此功能轻松计算:

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

应该为你做。如果您希望为联盟过滤的数据,则可以使用scope