1

Railsは非常に新しく、いくつかの単純なプロジェクトを管理してきましたが、現在はテーブル間のより複雑な関連付けに踏み込んでおり、何らかの助けを期待していました。

シナリオは、スポーツの試合に最もよく関連している可能性があります。私たちが持っているとしましょう

1)チーム(has_manyプレイヤー)

2)プレーヤー(belongs_toチーム)

3)マッチ-今ではトリッキーになります。

試合には、2つのチームと、それに参加する22人のプレーヤー(各サイドに11人)が含まれます。また、各プレーヤーに関連付けられているのは、試合のスコアです(たとえば、ゴールショット、得点、ポイントなど)。

この種の関連付けを作成するためのベストプラクティスは何でしょうか。ヒントをいただければ幸いです。

4

2 に答える 2

0

プレイヤーはメニーマッチを持っており、所属しています

そのテーブルには、その試合をプレイしているプレーヤーの詳細が含まれている必要があります。たとえば、彼がどのチームでプレーしたか、どの分から(プレーヤーは変更できるため)などです。

于 2012-08-03T09:47:22.043 に答える
0

モデル

app / models / team.rb

class Team < ActiveRecord::Base
    has_many :players, inverse_of: :team
    has_many :team_matches
    has_many :matches, through: :team_matches
end

app / models / player.rb

class Player < ActiveRecord::Base
    belongs_to :team, inverse_of: :player
    has_many :player_matches
    has_many :matches, through: :player_matches
end

app / models / match.rb

class Match < ActiveRecord::Base
    has_many :players, through: :player_matches
    has_many :teams, through: :team_matches
end

app / models / team_match.rb

class TeamMatch < ActiveRecord::Base
    belongs_to :team
    belongs_to :match
end

app / models / player_match.rb

class PlayerMatch < ActiveRecord::Base
    belongs_to :player
    belongs_to :match
end

移行

db / migrate / create_matches.rb

class CreateMatches < ActiveRecord::Migration
  def change
    create_table :matches do |t|
      t.datetime :happened_at
      t.timestamps
    end
  end
end

db / migrate / create_players.rb

class CreatePlayers < ActiveRecord::Migration
  def change
    create_table :players do |t|
      t.string :name
      t.timestamps
    end
  end
end

db / migrate / create_teams.rb

class CreateTeams < ActiveRecord::Migration
  def change
    create_table :teams do |t|
      t.string :name
      t.timestamps
    end
  end
end

db / migrate / create_player_matches.rb

class CreatePlayerMatches < ActiveRecord::Migration
  def change
    create_table :player_matches do |t|
      t.integer :match_id
      t.integer :player_id
      t.integer :player_shots_on_goal
      t.integer :player_goals_scored
      t.timestamps
    end
  end
end

db / migrate / create_team_matches.rb

class CreateTeamMatches < ActiveRecord::Migration
  def change
    create_table :team_matches do |t|
      t.integer :match_id
      t.integer :team_id
      t.integer :team_points
      t.timestamps
    end
  end
end

Edit1:@Mischaはここでクレジットを共有する必要があります!:)

Edit2:多くのバージョンについて申し訳ありませんが、私はこの問題を完全に過小評価していました。

于 2012-08-03T09:58:25.310 に答える