2012-01-31 30 views
0

我尝试使用轨道构建足球经理游戏,并且我与轨道关联卡住了。在轨道中使用多个连接找到

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 

我要像做(在联赛控制器的显示方法):

@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 

该查询返回所有球队一个赛松...但我不实现,使之成为联赛

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

回答

0

在联赛控制器,在表演方法,我尝试像

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

我将包括在查找声明联赛有同样的结果选项卡中的所有属性(名称为实例)。

我知道我可以在另一个查询中了解联盟的信息,但这不是最好的方式。

0

工作,我不知道你如何到达这一点,但你的命名约定是错误的Rails应用程序。

让我们看看历史。 你的模型应该被称为“历史”。
应用程序/模型的第一线/ history.rb是:
class History < ActiveRecord::Base

在数据库中生成的表应该被称为“历史”。

然后当你建立你的关联时,你需要注意多元化。

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

的赛松协会应该是这样的:

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

希望这有助于。

+0

我的数据库是用法语提出的,我用英文翻译了一些字段,但似乎我犯了翻译错误。我编辑关于你所说的话的线程。谢谢 – psic 2012-01-31 21:16:24

1

如果你用另一种语言命名你的表和模型,那么你很可能不会遵循Rails的命名约定(但它也可能发生在英语上!)。

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

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

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

@saison_teams = saison.teams 

然后,你想一个部门的所有球队,但你还没有告诉我们一个部门是什么!

+0

OH ...我想要一个联盟的所有球队 – psic 2012-01-31 22:19:24

+0

那么,你可以像这样迭代球队,但它不是很有效率:'League.saisons.each do | saison |把saison.teams结束' – Ashitaka 2012-01-31 22:36:00

+0

是的,但我宁愿使用和找到最好的:包括声明,以获得我的ifnd声明中的联赛和saison之间的联接,为了学习 – psic 2012-01-31 22:45:26