0

Ich habe zwei ähnliche M: M-Beziehungen, mit denen ich individuell arbeite, aber ich weiß nicht, wie sie ohne Konflikte arbeiten sollen.Zwei ähnliche Viele-zu-Viele-Beziehungen

Beziehungen Spieler & Teams

1) sind viele Spieler viele Teams

2) Viele Spieler "sind Mitglieder von" viele Teams

class Player < ActiveRecord::Base 
    has_many :plays 
    has_many :members 
    has_many :teams, through: :plays 
    has_many :teams, through: :members 
end 

class Teams < ActiveRecord::Base 
    has_many :plays 
    has_many :members 
    has_many :players, through: :plays 
    has_many :players, through: :members 
end 

class Play < ActiveRecord::Base 
    belongs_to :players 
    belongs_to :teams 
end 

class Member < ActiveRecord::Base 
    belongs_to :players 
    belongs_to :teams 
end 

I "für spielen" müssen in der Lage sein zu finden:

Player.find(21).teams #who he plays for 
Player.find(21).teams #who he is a member of 

Antwort

1

Sie müssen jeder has_many Assoziation einen anderen Namen geben und den source Parameter verwenden, um den tatsächlichen Assoziationsnamen anzugeben.

So:

class Player < ActiveRecord::Base 
    has_many :plays 
    has_many :memberships 
    has_many :played_with_teams, through: :plays, source: :team 
    has_many :member_of_teams, through: :memberships, source: :team 
end 

class Team < ActiveRecord::Base 
    has_many :plays 
    has_many :memberships 
    has_many :played_players, through: :plays, source: :player 
    has_many :member_players, through: :members, source: :player 
end 

class Play < ActiveRecord::Base 
    belongs_to :player 
    belongs_to :team 
end 

class Membership < ActiveRecord::Base 
    belongs_to :player 
    belongs_to :team 
end 

Das kann wie folgt verwendet werden:

Player.find(21).played_with_teams #who he plays for 
Player.find(21).member_of_teams #who he is a member of 

Hinweis: ich die Antwort aktualisiert.

+0

Was ist der Unterschied zwischen Klassenname: 'Team' und Quelle: 'Team'? – Dercni

+0

überprüfen Sie dies für eine Erklärung zu dem Unterschied: https://stackoverflow.com/q/13611265/368167 –

Verwandte Themen