2013-03-08 27 views
7

Birden çok kaynakla bir has_many through ilişkisi oluşturmaya çalışıyorum. Örneğin, bir oyunun bir home_team ve away_team vardır ve bir turnuvada birden fazla oyun vardır.has_many

Oyun ilişkileri aracılığıyla has_many kullanarak tüm takımları turnuvaya katmanın en iyi yolu nedir?

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

ama gibi hareket yapmak için bir yol istiyorum:

Şu anda benim kod şöyle görünür

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

EDIT: birçok ilişki birçok benim sorunum değil. Aşağıdaki gibi yapısı varsayarak turnuvadaki tüm takımları elde etmenin iyi bir yolu var mı?

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 

Tournament.teams yapmanın bir yolu var mı?

+1

benzer bir sorunu vardı ve benim şema etrafında çalışmak değiştirilmesi sona erdi, ama baktım bir seçenek '.merge' http kullanarak bir yöntem oldu: // stackoverflow.com/questions/11486027/birleştirme-sonuç -dan-iki-bir-çok-dernekler-with-aynı-modeli ile Düzenleme: Daha fazla düşünün, ben bunu yapmak için raylar bahse girerim evde tek masa kalıtım olduğunu ve uzak oyunların, birleştirme tablosunu sağlayan bir ana soyut sınıfı olan 'Game' vardır. Bir dahaki sefere deneyeceğim :) – thebenedict

cevap

4

Dahili bir çözüm bulmaya çalışırken biraz zaman geçirdikten sonra, oyunlarda takım adı verilen özel bir sorgu yazdım. Ekip_1 ve ekip_2 aracılığıyla ekiplere iki kez takımlar katılır ve oyun kimlikleri listesinin herhangi birinin bu iki birleşmeden birinde olup olmadığını kontrol eder.

Bu çözüm pek çok sorgulama gerektirdiğinden pek iyi değildir (Bunlardan biri tüm oyun kimliğinin sadece büyük bir listesidir), ancak başka bir yol bulmaya çalışmak için çok zaman harcadım ve yapamadım. En azından bu şekilde çalışır.

Daha iyi bir yol öğrenmek isterim. oyunların içine

Kodu:

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

böyle modeller tanımlayın:

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 

Sonra denetleyicisi aramak, ya da her:

tournament.teams 

DÜZENLEME:

size Tournament problemin bu tür scope tanımlayabiliriz modeli. Bu, bazı özel sorgulara benzer, daha ziyade kutudan raylarla desteklenir. Ya da en azından şu anda hatırlayamıyorum.

Bunları nasıl kullanacağınızı görebilirsiniz.

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/

Tüm takımlara alacağı bir sorgu oluşturabilirsiniz

. İstediğiniz herhangi bir sorgu oluşturabilirsiniz.

+1

Bir oyunda bu örnekte tek bir takım var mı yoksa bir şey mi özlüyorum? –

+0

ouh, evet, kesinlikle haklısınız. Hızla bunu gözden kaçırdım. Bana işaret ettiğin için teşekkürler. – Aleks

+0

Birisi '-1' koyar ve bunun için bir neden koymazsa sevdim. Kabul edilen çözümün çirkin bir özel sorguya sahip olması. Horay. – Aleks