【问题标题】:Has_many: through in Rails. Can I have two foreign keys?Has_many:通过在 Rails 中。我可以有两个外键吗?
【发布时间】:2012-02-05 05:49:54
【问题描述】:

我是 Rails 新手,我正在尝试创建如下所示的数据库架构:

有很多匹配项。每场比赛有 2 支球队。

一支球队有很多场比赛。

团队模型和比赛模型通过比赛表连接在一起。

我有一个包含 match_id、team1_id 和 team2_id 的竞赛模型。

但我不知道如何完成这项工作,或者它是否是最好的方法。我不知道如何使某些团队成为team1 和其他团队2.... 两个外键?那可能吗?

比赛表还需要保存其他数据,例如 team1_points 和 team2_points、赢家和输家等。

【问题讨论】:

    标签: ruby-on-rails ruby


    【解决方案1】:

    您可以在一个表中拥有任意数量的外键。我编写了一个应用程序,涉及安排团队玩游戏。

    我在 Game 类中的处理方式如下:

    class Game < ActiveRecord::Base
      belongs_to :home_team, :class_name => 'Team', :foreign_key => 'team1_id'
      belongs_to :visitor_team, :class_name => 'Team', :foreign_key => 'team2_id'
    

    您可以为 team1_points、team2_points 等添加适当的字段。您需要使用以下内容设置团队模型:

    class Team < ActiveRecord::Base
      has_many :home_games, :class_name => 'Game', :foreign_key => 'team1_id'
      has_many :visitor_games, :class_name => 'Game', :foreign_key => 'team2_id'
    
      def games
        home_games + visitor_games
      end
    
      #important other logic missing
    end
    

    请注意,我的一些命名约定是不得不使用旧数据库的结果。

    【讨论】:

    • 这是一个很大的帮助。谢谢!这样我就完全理解了,这只是一个 has_many 到 has_many 的关联,对吧?不是has_many:通过??? :home_team 和 :visitor_team 基本上只是伪模型,不是实际模型???我只是在编造这个词,但似乎就是这样。 (与 :home_games 和 :visitor_games 相同。)再次感谢您!
    • 没错。 :class_name 标签告诉你它实际上是什么模型。没有“home_team”模型,只有一个团队。这意味着 myGame.home_team 为您提供了对 Team 对象的引用。如果这对您有帮助或回答了您的问题,请将其标记为答案。
    【解决方案2】:

    我遇到了类似的问题,并扩展了之前的答案,我所做的是:

    class Game < ActiveRecord::Base
    
      def self.played_by(team)
        where('team1_id = ? OR team2_id = ?', team.id, team.id)
      end
    end
    
    class Team < ActiveRecord::Base
    
      def games
        @games ||= Game.played_by(self)
      end
    end
    

    这样,Team#games 返回 ActiveRecord::Relation 而不是 Array,因此您可以继续链接其他范围。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-04-19
      • 1970-01-01
      • 1970-01-01
      • 2011-05-06
      • 1970-01-01
      • 2014-08-10
      相关资源
      最近更新 更多