【问题标题】:find using multiple joins in rails在rails中使用多个连接查找
【发布时间】:2012-01-31 20:24:56
【问题描述】:

我尝试使用 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

这个查询返回一个赛季的所有球队......但我没有做到让它适用于联赛

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

【问题讨论】:

    标签: ruby-on-rails join associations


    【解决方案1】:

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

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

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

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

    @saison_teams = saison.teams
    

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

    【讨论】:

    • 哦...我想要一个联赛的所有球队
    • 嗯,你可以像这样遍历团队,但效率不高:League.saisons.each do |saison| puts saison.teams end
    • 是的,但我宁愿使用并找到最好的 :include 语句,以便在我的 ifnd 语句中获得联赛和赛季之间的连接,以便学习
    【解决方案2】:

    我不确定你是怎么走到这一步的,但是你的命名约定对于 Rails 应用程序是错误的。

    让我们看看历史。 您的模型应称为“历史”。
    app/models/history.rb 的第一行是:
    class History &lt; ActiveRecord::Base

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

    那么当你建立你的联想时,你需要注意多元化。

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

    Saison 关联应如下所示:

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

    希望这会有所帮助。

    【讨论】:

    • 我的数据库是用法语写的,我用英语翻译了一些字段,但似乎我翻译错了。我根据您所说的内容编辑 mu 线程。谢谢
    【解决方案3】:

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

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

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

    我知道我可以在另一个查询中查询有关联赛的这些信息,但这不是最好的方法。

    【讨论】:

      猜你喜欢
      • 2022-01-09
      • 2017-08-06
      • 2021-04-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-01-16
      相关资源
      最近更新 更多