2017-03-05 3 views
2

私はRailsの初心者ですが、私が行くにつれて学習しています。私はトーナメントエントリーポータルを作成しようとしています。そこでは、チームが特定のトーナメントの選手を入力します。私は協会について少し読んだことがありますが、このインスタンスでそれらをどのように適用するかについて私の頭を包んでいるいくつかの問題を抱えています。基本的な概要としてトーナメント - >チーム - >選手団体

  • 一つの大会では、多くのチームを持っています。
  • 各チームには多くの選手を持って
  • ため1試合も多くの選手を持ってい

ここでは、このための私のコードだが、私はそれが私は右のためだかわからない(
が入力されたチームを介して)プレーヤーに関連付けられたトーナメントIDを取得できません。あるプレーヤーテーブルの両方内

(tournament.rb)

class Tournament < ApplicationRecord 
    has_many :teams 
    has_many :players, :through => :teams 
end 

(team.rb)

class Team < ApplicationRecord 
    belongs_to :tournament 
    has_many :players 
end 

(player.rb)

class Player < ApplicationRecord 
    has_one :team 
    has_one :tournament, :through => :team 
end 

は& tournament_idをTEAM_ID私はコンソールで試してみると、私はチームのIDフィールドに関連付けを行うことしかできませんe。

私の団体と何か面白いことがあるのでしょうか?

答えて

0

'belongs_to'、 'has_many'、 'has_one'の使用方法は、もちろんデータベースのデータモデルによって異なります。

あなたはplayersテーブルに外部キーをTEAM_IDしている場合、あなたのようにプレイヤーのクラスを定義する必要があります: - >チーム多対多の関連を持っている必要があります加えて

class Player < ApplicationRecord 
    belongs_to :team 
    has_one :tournament, :through => :team 
end 

、私は本当にトーナメント<がいることを信じています(チームがもちろん多くのトーナメントに参加できる場合)。私は、モデルTeamTournamentを追加提案として、最終的なモデル構造を定義しますチームとトーナメント

class Player < ApplicationRecord 
    belongs_to :team 
    belongs_to :tournament 
end 
+0

興味のあるものTeamTournamentモデルはどのように使用されますか?私は場所の周りのいくつかの異なる答えと例で同様のコンセプトを見たことがありますが、おそらく経験の欠如の使用/コンセプトの周りに頭を浮かべることはできません。 – afishintaiwan

0

プレーヤークラス。あなたの質問は、tournament_idplayerから得るように関連付けを設定する方法ではなく、あなたのモデルの関連性に関するものと仮定します。だから私はあなたのプロジェクトについてのいくつかのヒントを手渡そうとします、そして、団体はそれのために設定することができます。 には多くのteamsteamにはplayersがたくさんあります。しかし、tournament_idplayerにしたいとします。実際のトーナメントでは実際にはいくつかの選手がいるかもしれないが、すべての選手がいくつかのトーナメントに所属する必要はないので、そうしたくないと思う。彼は多くのトーナメントに参加することができます。だからあなたはそれのための協会を設定する必要はありません。トーナメントやチームと同じこと。しかし、チームには選手がいるので、チームに所属しなければなりません。だからあなたはそれのための協会が必要です。

(tournament.rb)

class Tournament < ActiveRecord::Base 
    has_many :teams 
end 

(team.rb)

class Team < ActiveRecord::Base 
    has_many :players 
end 

(player.rb)

:あなたのようになりますため

は私のセットアップのまとめ

class Player < ActiveRecord::Base 
    belongs_to :team 
end 

team = Team.first # just take some team 
Tournament.includes(:teams).where(teams: { id: team.id }) 

あなたが他の目標を達成することができ、同じように(トーナメント特定のプレイヤーがにし、その上で属します):あなたは、特定のteamは直接関連のないに参加tournamentを得ることができます。しかし、そのような場合は関連が必要ありません。オブジェクトが概念的に別のものに関連する場合、関連付けが必要です。

+0

'' 'belongs_to:tournament、:through =>:team'''は動作しません。 –

+0

'belongs_to'は現在のテーブルのforeign_keyで動作します。選手のテーブルにトーナメントへの参照が含まれていない限り、トーナメントは「has_one:トーナメント、through::チーム」のように定義することができます –

0

OKとの関連BELONGS_TO持っている必要があり

class Tournament < ApplicationRecord 
    has_many :team_tournaments 
    has_many :teams, :through => :team_tournaments 
    has_many :players, :through => :teams 
end 

class TeamTournament < ApplicationRecord 
    belongs_to :team 
    belongs_to :tournament 
end 

class Team < ApplicationRecord 
    has_many :team_tournaments 
    has_many :tournaments, :through => :team_tournaments 
    has_many :players 
end 
関連する問題