我有一個比賽模型和一個團隊模型。Ruby on Rails - 在許多比賽中球隊的進球數
我要算多少聯賽中進球團隊得分(這樣我要總結的那支球隊的所有得分,在這兩個home_matches和away_matches)。
我該怎麼做?我應該將哪些列放入匹配和隊數據庫表?
我有一個比賽模型和一個團隊模型。Ruby on Rails - 在許多比賽中球隊的進球數
我要算多少聯賽中進球團隊得分(這樣我要總結的那支球隊的所有得分,在這兩個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
因爲這可能是昂貴的(尤其是如果你經常這樣做的話),你可能會將這個值緩存到團隊模型中,並在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
,如果你希望緩存該值(只緩存最近更改與我建議的實施,但需要調整)。
你不把它放在任何表格中。 Theres數據庫規則:不要將數據存儲在數據庫中,可以從其他字段計算數據。
可以easyly使用此功能calcuate說:
def total_goals
self.home_matches.collect(&:home_goals).inject(&:+)+self.away_matches.collect(&:away_goals).inject(&:+)
end
應該爲你做。如果你想爲聯盟篩選出墊球,你可以使用scope
。
關於這個規則 - 保存信息不是更好,所以每次都不會重新計算嗎? –
我不同意不惜一切代價避免重複數據。緩存表和列非常有用。事實上,'counter_cache'內置於ActiveRecord中(一個緩存列的例子,對於這個特定的問題並不直接有用)。 – bdares
是的,我真的不認爲這符合數據庫的規則,如果你想索引這些數據呢? –
非常感謝,我會盡快嘗試。但是,因爲我是一名新手,所以我想知道當你談論將價值緩存到模型中時你的意思。我該怎麼辦? –