2010-11-28 12 views
5

Was ist der beste Weg zu erreichen, hat zwei Assoziation mit ActiveRecord?ActiveRecord hat zwei association

Ich habe ein Team und Spiel-Modelle. Jedes Team wird have_many Spiele @team.games. Ein Spiel wird zwei Teams haben @game.hosting_team und @game.opposing_team.

Ich begann mit zwei belongs_to/has_one Assoziationen, aber dann @team.games würde nur ihre Heimspiele zurückgeben.

Die andere Option, die ich mir vorstellen kann, ist die Verwendung eines HABTM und die Verwendung eines Validators, um sicherzustellen, dass es nur Datensätze gibt. Das einzige, was fehlt, ist, die Heimmannschaft im Auge zu behalten. Es scheint, als ob ich eine habe viele durch Assoziation, aber ich bin mir nicht genau sicher ...

Danke für Ihre Hilfe.

Dies ist ein Beispiel dafür, wie die beiden has_many Assoziationen aussehen. Das Problem hier ist, würde ich team.games und team.opponents zu nennen haben eine vollständige Liste ihrer Spiele zu bekommen

class Team < ActiveRecord::Base 
    has_many :games 
    has_many :opponents, :class_name => "Team"#, :foreign_key => "" 
end 

class Game < ActiveRecord::Base 
    belongs_to :team, :class_name => "Team" #, :foreign_key => "team_id" 
    belongs_to :opponent, :class_name => "Team" #, :foreign_key => "opponent_id" 
end 

ich so etwas wie dies möchte aber das ist offensichtlich nicht, wie belongs_to funktioniert.

class Team < ActiveRecord::Base 
    has_many :games 
end 

class Game < ActiveRecord::Base 
    belongs_to :hosting_team 
    belongs_to :opposing_team 
end 

Meine gewünschte API würde so aussehen.

@team.games # return all games home or away 
@game.hosting_team # Team 
@game.opposing_team # Team 
+0

Können Sie calrify die Beziehungen des Modells und vielleicht posten Sie Ihre db/schema.rb? –

+0

Danke. Ich habe die Frage bearbeitet. – jspooner

Antwort

3

Sie können sich wahrscheinlich noch es Modell mit dem bt/ho Verbänden und Spiele als Accessormethode auf das Team statt als Verein gegründet:

class Team < ActiveRecord::Base 
    def games 
    Game.find(:conditions => ["home_team_id = ? OR away_team_id = ?", id, id]) 
    end 
end 
+0

Ja, gute Idee. Mein Team-Modell hätte have_many: home_games und have_many away_games. Dann würde Ihre Spielmethode beide auswählen. Danke das ist wahrscheinlich die Antwort. – jspooner