2013-07-04 6 views
7

मेरे पास एक टीम मॉडल और एक फिक्स्चर मॉडल है। फिक्स्चर मॉडल में एक दूर टीम और एक होम टीम है। मैंने उदाहरण के बाद this answer में और अधिकांश चीजें काम कर रही हैं।रेल के पास कई कस्टम ActiveRecord एसोसिएशन

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 

मैं @ team.fixtures कॉल करने के लिए टीमों जुड़नार के सभी की एक सूची प्राप्त करने के लिए, वर्तमान में सक्षम होना चाहते हैं @ team.home_games मुझे घर जुड़नार देता है और @ team.away_games मुझे aways देता है। मैं has_many :gameshas_many :home_games के समान कैसे लिख सकता हूं, और क्या यह करने का सबसे अच्छा तरीका है?

उत्तर

7

मुझे लगता है कि सबसे अच्छा तरीका है लिखने के लिए उस के लिए एक उदाहरण विधि होगा:

टीम मॉडल में:

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

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

एक नियमित रूप से विधि की तरह इसका इस्तेमाल

यह एक ActiveRecord :: रिलेशन वापस करना चाहिए जो पुन: उपयोग है le के लिए गुंजाइश चेन, आदि

(यहाँ एक ऐसी ही सवाल है, लेकिन has_one साथ: Rails Model has_many with multiple foreign_keys)


इसके अलावा, आप टीम के आईडी का उपयोग कर इसे से एक वर्ग विधि बना सकता है (आप पहले से ही team_id नहीं बल्कि टीम उदाहरण वस्तु) है:

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 

और इस तरह इसका इस्तेमाल:

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

अच्छा लग रहा है, धन्यवाद! –

संबंधित मुद्दे