マッチモデルとチームモデルがあります。
リーグ中にチームが獲得したゴール数を数えたい(したがって、home_matchesとaway_matchesの両方でそのチームのすべてのスコアを合計する必要があります)。
どうやってやるの?試合とチームのデータベーステーブルにどの列を配置する必要がありますか?
マッチモデルとチームモデルがあります。
リーグ中にチームが獲得したゴール数を数えたい(したがって、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
それはあなたのためにそれをするはずです。リーグ用にメッシュをフィルタリングしたい場合は、scope
そのためにを使用できます。