С тремя отношениями «многие ко многим» в Rails, как мне найти одно, учитывая два других? - PullRequest
0 голосов
/ 18 февраля 2012

У меня 3 модели.

class Team < ActiveRecord::Base
  ...
  has_many :seasons_teams, :dependent => :destroy                          
  has_many :seasons, :through => :seasons_teams
  has_and_belongs_to_many :players
  ...
end

class Season < ActiveRecord::Base
  ...
  has_many :players_seasons, :dependent => :destroy
  has_many :players, :through => :players_seasons
  has_many :seasons_teams, :dependent => :destroy
  has_many :teams, :through => :seasons_teams
  ...
end

class Player < ActiveRecord::Base
  ...
  has_many :players_seasons, :dependent => :destroy
  has_many :seasons, :through => :players_seasons
  has_and_belongs_to_many :teams
  ...
end

Будут проводиться проверки, в которых каждый игрок может иметь не более одной команды на каждый сезон.

Я ищу эффективный способ собрать команду игроков на любой сезон, т. Е .:

@player.team(@season)

Спасибо!

Ответы [ 3 ]

1 голос
/ 18 февраля 2012

Я думаю, что-то вроде этого должно работать:

@player.teams.joins( :seasons ).where( :season_id => @season.id ).first

Чтобы получить красивый лаконичный синтаксис, который вы ищете, используйте его в области видимости, например ::10000

class Team < ActiveRecord::Base
  scope :for_season, lambda do |season|
    joins( :seasons ).where( :season_id => season.id )
  end
  # ...
end

class Player < ActiveRecord::Base
  # ...

  def team season
    teams.for_season( season ).first
  end
end

@player.team @season
# => #<Team:0x...>
0 голосов
/ 18 февраля 2012

Похоже, у вас либо опечатка, либо ошибка в классе вашей команды. Я думаю, что вы должны иметь:

has_many :seasons, :through => :seasons_teams
0 голосов
/ 18 февраля 2012
@player.teams.find_by_season_id(@season.id)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...