0

マッチモデルとチームモデルがあります。

リーグ中にチームが獲得したゴール数を数えたい(したがって、home_matchesaway_matchesの両方でそのチームのすべてのスコアを合計する必要があります)。

どうやってやるの?試合チームのデータベーステーブルにどの列を配置する必要がありますか?

4

2 に答える 2

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 :leagueMatchモデルに、goal_countメソッド(およびそのクエリ)にリーグパラメーターを追加しgoal_count_cache_league、値をキャッシュする場合は列を追加する必要があります(最近変更されたもののみをキャッシュします実装を提案しましたが、必要に応じて微調整します)。

于 2012-12-25T15:33:47.413 に答える
-1

あなたはそれをどんなテーブルにも入れてはいけません。データベースにはルールがあります。他のフィールドから計算できるデータをデータベースに保存しないでください。

この関数を使用して、これを簡単に計算できます。

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

それはあなたのためにそれをするはずです。リーグ用にメッシュをフィルタリングしたい場合は、scopeそのためにを使用できます。

于 2012-12-25T14:09:23.097 に答える