我有一个Match模型和一个Team模型。
我想计算一个球队在联赛中的进球数(所以我必须将该球队的所有分数相加,在home_matches和away_matches 中)。
我怎样才能做到这一点?我应该将哪些列放入比赛和团队数据库表中?
我有一个Match模型和一个Team模型。
我想计算一个球队在联赛中的进球数(所以我必须将该球队的所有分数相加,在home_matches和away_matches 中)。
我怎样才能做到这一点?我应该将哪些列放入比赛和团队数据库表中?
我假设您的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
那应该为你做。如果您想为联赛过滤数学,您可以使用 a scope
。