2012-12-25 38 views

回答

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 

因爲這可能是昂貴的(尤其是如果你經常這樣做的話),你可能會將這個值緩存到團隊模型中,並在Match模型上使用after_save掛鉤(如果匹配被刪除,那麼掛鉤也是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 

既然你想爲聯賽做這個,你可能想在Match模型,聯賽參數的goal_count方法(和它的查詢),以及goal_count_cache_league列添加belongs_to :league,如果你希望緩存該值(只緩存最近更改與我建議的實施,但需要調整)。

+0

非常感謝,我會盡快嘗試。但是,因爲我是一名新手,所以我想知道當你談論將價值緩存到模型中時你的意思。我該怎麼辦? –

-2

你不把它放在任何表格中。 Theres數據庫規則:不要將數據存儲在數據庫中,可以從其他字段計算數據。

可以easyly使用此功能calcuate說:

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

應該爲你做。如果你想爲聯盟篩選出墊球,你可以使用scope

+0

關於這個規則 - 保存信息不是更好,所以每次都不會重新計算嗎? –

+0

我不同意不惜一切代價避免重複數據。緩存表和列非常有用。事實上,'counter_cache'內置於ActiveRecord中(一個緩存列的例子,對於這個特定的問題並不直接有用)。 – bdares

+0

是的,我真的不認爲這符合數據庫的規則,如果你想索引這些數據呢? –