2013-07-04 19 views
7

Ich habe ein Team-Modell und ein Fixtures-Modell. Das Fixtures-Modell hat eine Auswärtsmannschaft und ein Heimteam. Ich bin dem Beispiel in this answer gefolgt und habe die meisten Dinge am Laufen.Schienen has_many benutzerdefinierte ActiveRecord Association

class Fixture < ActiveRecord::Base 
    belongs_to :home, class_name: 'Team' 
    belongs_to :away, class_name: 'Team' 
end 


class Team < ActiveRecord::Base 
    has_many :home_games, :class_name => 'Fixture', :foreign_key => 'home_id' 
    has_many :away_games, :class_name => 'Fixture', :foreign_key => 'away_id' 
end 

Ich möchte @ team.fixtures anrufen können, eine Liste mit allen Teams Vorrichtungen zu bekommen, zur Zeit @ team.home_games gibt mir die Heimspiele und @ team.away_games gibt mir die aways. Wie kann ich eine has_many :games ähnlich wie has_many :home_games schreiben, und ist das der beste Weg, es zu tun?

Antwort

7

Ich denke, der beste Weg, eine Instanz Methode dafür zu schreiben wäre:

Im Team Modell:

def games 
    Fixture.where("home_id = ? OR away_id = ?", self.id, self.id) 
end 

Verwenden Sie es wie eine normale Methode:

Team.first.games 
#=> [<Fixture id: ... >, <Fixture id: ... >, ... ] 

Dies sollte eine ActiveRecord :: Relation zurückgeben, die ist re-usab le für Umfang Verkettungs usw.

(Hier ist eine ähnliche Frage, aber mit has_one: Rails Model has_many with multiple foreign_keys)


Auch könnten Sie eine Klassenmethode von ihm mit der ID des Teams machen (wenn Sie bereits die team_id haben, aber nicht das Team Instanz-Objekt):

class Team < ActiveRecord::Base 
    has_many :home_games, :class_name => 'Fixture', :foreign_key => 'home_id' 
    has_many :away_games, :class_name => 'Fixture', :foreign_key => 'away_id' 

    def games 
    Team.games(self.id) 
    end 

    def self.games(team_id) 
    Fixture.where('fixtures.home_id = ? OR fixtures.away_id = ?', team_id, team_id)  
    end 
end 

Und es wie folgt verwenden:

Team.games(params[:team_id]) 
# or 
@team = Team.where(id: params[:id]).first 
@team.games 
+0

sieht gut aus, danke! –

Verwandte Themen