2017-03-05 6 views
2

나는 레일스와의 상대적인 초보자이지만, 내가 배우는대로 배우고있다. 나는 토너먼트 엔트리 포털을 만들려고합니다. 팀은 주어진 토너먼트에 선수들을 입력 할 것입니다. 나는 협회에 관해 약간의 책을 읽었지만이 경우에 적용하는 방법에 대해 머리를 감싸는 데 어려움을 겪고 있습니다. 기본적인 개요로토너먼트 -> 팀 -> 선수 협회

:

  • 한 대회는 많은 팀이있다.
  • 각 팀은 많은 선수를 가지고
  • 따라서 하나 개의 대회도 많은 선수가 있습니다

다음이 내 코드입니다,하지만 난 그게 난 잘 때문에 확실하지 않다 (
입력 한 팀을 통해) 플레이어와 관련된 tournament_ids를 얻을 수 없습니다. 거기 플레이어 테이블 모두 내

(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 필드,하지만 나는 콘솔을 시도 할 때 협회를 통해서만 team_id 필드를 채울 수있다. 이자형.

내 연관성에 어긋나는 것이 있는지 궁금합니다.

답변

0

'belongs_to', 'has_many', 'has_one'의 사용법은 물론 데이터베이스의 데이터 모델에 따라 다릅니다. 당신이 players 테이블에 외래 키를 team_id 경우

, 당신은 플레이어의 클래스를 정의해야합니다

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

, 정말 토너먼트 < 있다고 생각 -> 팀이 있어야 많은-to-many 연관 (팀이 많은 토너먼트에 참가할 수 있다면). 나는 모델 TeamTournament을 추가 제안 및 등의 최종 모델 구조를 정의하는 것입니다 : 팀과 토너먼트

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

관심의 대상이 TeamTournament 모델은 어떻게 사용됩니까? 그 장소 주변의 몇 가지 다른 답변과 예에서 비슷한 개념을 보았지만 사용/개념에 대한 내 머리를 잡을 수는 없습니다. 아마도 경험이 부족했을 것입니다. – afishintaiwan

0

Player 클래스. 귀하의 질문은 tournament_idplayer에서 얻는 방법을 설정하는 대신 모델 연결에 관한 것입니다. 그래서 나는 당신에게 당신의 프로젝트에 관한 몇 가지 조언을 주겠다. 그리고 협회는 그것을 설정할 수있다.

포털 아이디어를 얻은대로 ... tournament에는 teams이 많고 team에는 많은 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 => : 팀''은 작동하지 않습니다. –

+0

'belongs_to'는 현재 테이블의 foreign_key와 함께 작동합니다. '선수'테이블에 토너먼트에 대한 언급이 포함되어 있지 않으면 토너먼트는 'has_one : tournament, through : : team''으로 정의 될 수 있습니다. –

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