2011-03-17 2 views
0


Позвольте мне описать то, что я хочу сделать:
Существует модель матча, который должен иметь информацию о том, что игроки и какие кланы приняли участие в нем, с разделением домашних игроков и кланов и прочь игроков и клана.
Это довольно просто, но есть еще одна модель: Summoner. В каждом матче у каждого игрока есть другой summoner, и мне нужно сделать что-то вроде этого: Match.find(1).players_home.find(1).Summoner.name, чтобы извлечь, который вызывающий игрок играл 1 в домашней команде.
Дело в том, что каждый игрок в каждом матче может играть с разным summoner.
Надеюсь, я описал это четко.
С уважением.Помощь с ассоциациями в Rails

+1

Итак, в чем вопрос? У вас есть код, чтобы показать нам? – Wukerplank

+0

Вопрос в том, как настроить ассоциации и модели. – methyl

ответ

1

Я не совсем уверен, что все ваши требования в отношении, когда объединение является один или несколькими, но я думаю, что что-то подобное может быть это:

class Match 
    has_many :participations 
    has_many :players, :through => :participations 
end 

class Participation 
    belongs_to :match 
    belongs_to :player 
    belongs_to :summoner 

    # also a team attribute to store either "home" or "away" 
    scope :home, where(:team => "home") 
    scope :away, where(:team => "away") 
end 

class Player 
    belongs_to :clan 
    has_many :participations 
    has_many :matches, :through => :participations 
end 

class Summoner 
    has_many :participations 
end 

В этой конфигурации каждый матч имеет несколько официального участия. Каждое участие принадлежит игроку, который участвует, а также принадлежит вызывающему игроку и соответствует ему. Затем он может быть использован, возможно, как это:

В контроллере

@match = Match.find(1) 
@home_participations = @match.participations.home 
@away_participations = @match.participations.away 

В View

<h1>Home Players</h1> 
<% @home_participations.each do |p| %> 
    <p>Player: <%= p.player.name %>, Summoned by: <%= p.summoner.name %></p> 
<% end %> 

Я надеюсь, что это было по крайней мере несколько, что вы где собираетесь. Дайте мне знать, если вы ищете что-то еще.

+0

Настолько замечательное решение, спасибо! – methyl

Смежные вопросы