1

忍受我,因为我是一个 Rails 菜鸟。我有一个基本的联赛系统。联赛 -> 赛季 -> 分区 -> 球队。我希望我的部门和团队属于任意数量的赛季。我的模型如下...

class Season < ActiveRecord::Base
  belongs_to :league
  has_many :season_division_teams
  has_many :divisions, :through => :season_division_teams
end

class Division < ActiveRecord::Base
  belongs_to :league
  has_many :seasons, :through => :season_division_teams
  has_many :season_division_teams
  has_many :teams, :through => :season_division_teams
end

class Team < ActiveRecord::Base
  belongs_to :league
  has_many :season_division_teams
  has_many :seasons, :through => :season_division_teams
  has_many :divisions, :through => :season_division_teams
end

class SeasonDivisionTeam < ActiveRecord::Base
  belongs_to :season
  belongs_to :division
  belongs_to :team
end

我最终想要做的是,考虑到我在“第一季”,我有哪些部门,然后给这些部门哪些团队是这些部门的一部分(对于给定的赛季)。

Season.Find(1).divisions.all do |division|
    # Do something with the teams that make of the division (for that season)
    # division.teams.count
end

我只是不知道如何在 Rails 中做到这一点,这在 SQL 中对我来说似乎很简单。

在此先感谢您的帮助。

编辑:

澄清一下,我试图让球队在一个特定的赛季(包括他​​们的部门)。使用我的模型,我知道我可以得到给定季节的分区。我只需要那些部门和赛季的球队。

再次感谢。

4

1 回答 1

1

用于预先加载includes关联并在获得团队时避免 N+1 性能损失:

@season = Season.includes(:divisions => :teams).find(1)
divisions = season.divisions
teams = divisions.map(&:teams).flatten.uniq

如果您只想获得该赛季的所有部门和球队,那么请以不同的方式执行此操作。首先,将以下行添加到您的季节模型中:

has_many :teams, :through => :season_division_teams

现在您可以简单地执行以下操作:

@season = Season.find(1)
divisions = @season.divisions
teams = @season.teams

请注意,这里急切加载没有多大意义,因为数据库只会被命中两次(而不是每个分区一次然后再一次)。

更新

最后,如果您想获得本赛季的所有分区,然后是该赛季这些分区内的所有球队,请执行以下操作。您可以使用以下代码:

@season = Season.find(1)                     
divisions = @season.divisions
divisions.each do |division|
  puts "Division: #{division.name}"
  division.teams.where(:season_division_teams => {:season_id => @season.id}).each do |team|
    puts "Team: #{team.name}"
  end
end

但是使用急切加载是首选方法,如下所示:

@season = Season.find(1)                     
divisions = @season.divisions.includes(:season_division_teams => :teams).
                    where(:divisions => {:season_division_teams => {:season_id => @season.id}})
divisions.each do |division| 
  puts "Division: #{division.name}"
  division.teams.each do |team|
    puts "Team: #{team.name}"
  end
end

这应该会急切地加载符合我们合并条件的相关部门的所有团队。

于 2013-02-18T21:26:56.543 回答