在rails中找到使用多个连接

时间:2012-01-31 20:24:57

标签: ruby-on-rails join associations

我尝试使用rails构建一个足球经理游戏,并且我坚持使用rails协会。

team table
  ...

history table
  team_id
  saison_id

saison table
  league_id
  league table
  ...

我想找到一个联盟的所有球队。

class History < ActiveRecord::Base
  belongs_to :saison
  belongs_to :team
end

class Saison < ActiveRecord::Base
  has_many :histories
  has_many :teams, :through => :histories
  belongs_to :league
end

class League < ActiveRecord::Base
  has_many :saisons 
end

class Team < ActiveRecord::Bases
  has_many :histories
  has_many :saisons, :through => :histories
end

我想做一些事情(在联盟控制器的show方法中):

@team = Team.find(:all, :include => [:saisons => :histories, :leagues => :saisons], 
          :conditions => ["leagues.id = ?", params[:id]])

但它不起作用。

SQL查询:

SELECT Team.* 
FROM   Team, Saison, History, League  
WHERE  History.Team_ID = Team.ID AND 
       History.Saison_ID = Saison.ID AND 
       Saison.League_ID = League.ID

这个查询返回所有团队的一个saison ...但我没有达到让它适用于联盟

@division = Team.find(:all, :include => [:saisons => :histories],
                                :conditions =>["saisons.id =?",params[:id]])

3 个答案:

答案 0 :(得分:1)

如果您使用其他语言命名表格和模型,那么您更有可能不遵循Rails的命名惯例(但也可能发生在英语中!)。

无论如何,如果某个单词的复数不以S结尾,则必须转到位于inflections.rb的文件your_app/config/initializers并在其中添加复数的某些单词。这只是一个例子:

ActiveSupport::Inflector.inflections do |inflect|
  inflect.irregular 'merchandise', 'merchandising'
end

至于你的具体问题,我不确定我是否理解,但你想要一个赛季的所有球队?这很简单,只是:

@saison_teams = saison.teams

那么你想要一个部门的所有团队,但你没有告诉我们什么是分部!

答案 1 :(得分:0)

我不确定你是如何达到这一点的,但你的命名约定对于Rails应用程序是错误的。

让我们看一下历史。 你的模型应该被称为“历史” app / models / history.rb的第一行是:
class History < ActiveRecord::Base

数据库中生成的表应称为“历史记录”。

然后,当您设置关联时,您需要注意多元化。

has_many后面跟着一个复数词 belongs_to后面跟着一个单数词。

Saison协会应如下所示:

class Saison < ActiveRecord::Base
  has_many :histories
  has_many :teams, :through => :histories
  belongs_to :league
end

希望这有帮助。

答案 2 :(得分:0)

在联盟控制器中,在show方法中,我尝试了类似

的东西
 @team = Equipe.find(:all, :include => [:saisons => :history],
                                :conditions =>["saisons.league_id =?",params[:id]])

我会在find语句中包含联盟,以便在同一结果选项卡中包含其所有属性(例如名称)。

我知道我可以在另一个查询中获得有关联盟的信息,但这不是最佳方式。