我有匹配模型和团队模型。
我想要计算一支球队在联盟中得分的目标数(所以我必须在 home_matches 和 away_matches )中总结该球队的所有得分。
我该怎么做?我应该在匹配和团队数据库表中添加哪些列?
答案 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
。