0

私はサッカーの統計アプリケーションを設計しています。ゲーム(試合)の結果を保存することに固執しました。Team オブジェクトと Game オブジェクトがあります。まず、ゲームモデルを次のようにします

class Game
  include Mongoid::Document

  belongs_to :team_1, class_name: "Team"
  belongs_to :team_2, class_name: "Team"  

  field :score_1, type: Integer
  field :score_2, type: Integer

しかし、すべてのチームの試合を見つけることはできません。次に、次のようなことをすることにしました。

class Game
  include Mongoid::Document

  has_and_belongs_to_many :teams
  field :scores, type: Array

しかし、チームの順序がスコアと一致しないように見え、醜く見えます。次に、チームとそのスコアを格納するためのモデル Score を作成しました。Game モデルには多くの Score がありましたが、これは前のものよりも醜いです。

4

2 に答える 2

1

あなたが達成しようとしているモデルの種類は正確にはわかりませんが、私の意見では、モデルは、モデリングしているゲームの性質の現実を反映する必要があります。

したがって、そのアプローチを考慮すると、クラスの設計は次のようになります。

class Game
  class InvalidScorerError < Exception ; end
  include Mongoid::Document
  belongs_to :home_team, class_name: "Team"
  belongs_to :away_team, class_name: "Team"
  embeds_many :goals

  field :home_team_goals, type: Integer, default: 0
  field :away_team_goals, type: Integer, default: 0

  def register_a_goal(team)
    if team == home_team
        self.home_team_goals += 1
        self.save!
    elsif team == away_team
        self.away_team_goals += 1
        self.save!
    else
        raise InvalidScorerError, "Team should be either home or away!"
    end
  end

  def total_match_goals
    self.home_team_goals + self.away_team_goals
  end
end

class Team
  include Mongoid::Document
  has_many :inhouse_games, class_name: "Game", inverse_of: :home_team
  has_many :games_as_a_visitor, class_name: "Game", inverse_of: :away_team
end

編集: チャンピオンシップやスケジュールなど、考慮すべきことが他にもあります...実際の生活で物事がどのように起こるか想像してみてください. あなたのコードは現実の単なる抽象化です。

それが役に立てば幸い!

于 2013-08-05T21:40:51.260 に答える