2013-03-08 21 views
7

Ich versuche, eine has_many through Beziehung mit mehreren Quellen zu erstellen.has_many durch mehrere Quellen

Zum Beispiel hat ein Spiel eine home_team und away_team und ein Turnier hat mehrere Spiele.

Was ist der beste Weg, um alle Teams in das Turnier mit einer Beziehung has_many durch Spiele zu bekommen.

Im Moment sieht mein Code wie folgt aus:

class Tournament 
    has_many :teams, :through => :games, :source => :home_team, :uniq => true 
end 

aber ich möchte einen Weg es wie machen handeln:

class Tournament 
    has_many :teams, :through => :games, :source => [:home_team, :away_team], :uniq => true 
end 

EDIT: Das viele zu viele Beziehung ist nicht mein Problem. Gibt es einen guten Weg, um alle Mannschaften in das Turnier zu bekommen und die Struktur wie folgt zu übernehmen.

class Game 
    has_and_belongs_to_many :tournaments 
    belongs_to :home_team, :class_name => Team, :foreign_key => :home_team_id 
    belongs_to :away_team, :class_name => Team, :foreign_key => :away_team_id 
end 

class Tournament 
    has_and_belongs_to_many :games 
end 

Gibt es eine Möglichkeit Tournament.teams zu tun?

+1

hatte ein ähnliches Problem und schließlich die Änderung meines Schema um ihn zu arbeiten, aber eine Option, die ich an war sah eine Methode '.merge' http: // Stackoverflow.com/questions/11486027/merge-results-from-two-hat-viele-associations-with-the-same-model Edit: Denken Sie daran mehr, ich wette die Schienen Weg, es zu tun ist Single-Table-Erbe, wo zu Hause und Auswärtsspiele haben eine abstrakte Elternklasse "Game", die die Join-Tabelle bereitstellt. Ich werde das nächste Mal versuchen :) – thebenedict

Antwort

4

Nachdem ich einige Zeit damit verbracht habe, eine integrierte Lösung zu finden, habe ich gerade eine benutzerdefinierte Abfrage namens teams in games geschrieben. Es verbindet Teams zu Spielen zweimal durch Team_1 und Team_2 und überprüft, ob sich die Liste der Spiele-IDs in einem dieser beiden Joins befindet.

Diese Lösung ist nicht großartig, da sie mehrere Abfragen benötigt (Eine davon ist nur eine riesige Liste aller Spiel-IDs), aber ich habe viel Zeit damit verbracht, einen anderen Weg zu finden und konnte nicht. Zumindest funktioniert so.

Ich würde gerne einen besseren Weg lernen.

-Code innerhalb der Spiele:

def self.teams 
    joined_tables = Team.joins(:home_team).joins(:away_team) 
    joined_tables.where('games.id in (?) or away_team_games.id in (?)', 
        select(:id), select(:id)).uniq 
end 
-3

definieren Modelle wie folgt aus:

class Tournament 
    has_many :games 
    has_many :teams, :through => :games 
end 

class Game 
    belongs_to :torunament 
    belongs_to :team 
end 

class Team 
    has_many :games 
    has_many :tournaments, :through => :games 
end 

Und dann in der Steuerung rufen, oder wo auch immer:

tournament.teams 

EDIT:

Sie scope für diese Art von Problem in Sie definieren könnte Tournament Modell. Dies ist mehr wie eine benutzerdefinierte Abfrage, sondern wird von den Rails direkt unterstützt. Zumindest kann ich mich in diesem Moment nicht erinnern.

können Sie sehen, wie Sie sie verwenden.

http://guides.rubyonrails.org/active_record_querying.html http://apidock.com/rails/ActiveRecord/NamedScope/ClassMethods/scope http://ablogaboutcode.com/2011/02/19/scopes-in-rails-3/

Sie können eine Abfrage aufzubauen, die alle Teams bekommen würde. Sie können jede beliebige Abfrage erstellen.

+1

Ein Spiel hat nur ein einziges Team in diesem Beispiel oder fehlt mir etwas? –

+0

ouh, ja, du hast absolut recht. In Geschwindigkeit habe ich das übersehen. Danke, dass du mich darauf aufmerksam gemacht hast. – Aleks

+0

Ich mag es, wenn jemand '-1' setzt und keinen Grund dafür angibt. Wo akzeptiert Lösung hat eine hässliche benutzerdefinierte Abfrage. Horay. – Aleks