与同一个类有多个has_many关系

时间:2011-09-05 17:00:21

标签: ruby-on-rails activerecord has-many

我正在建立一个足球比赛,我在创建俱乐部和比赛课时遇到了麻烦。我希望能够做到这一点:

match = Match.find(2)
match.home_club = <some club here>
match.away_club = <other club here>

还有这个:

club = Club.find(2)
club.matches # Returns all matches where club plays home or away

这就是我现在所拥有的:

class Club < ActiveRecord::Base
  has_many :matches
end

class Match < ActiveRecord::Base
  belongs_to :home_club, :class_name => "Club"
  belongs_to :away_club, :class_name => "Club"
end

但是当我尝试Club.first.matches时,我收到了这个错误:

ActiveRecord::StatementInvalid: SQLite3::SQLException: no such column: matches.club_id: SELECT "matches".* FROM "matches" WHERE ("matches".club_id = 1)

我和:inverse_of一起玩过,但我没有让它发挥作用。甚至可能是这样,还是我需要在俱乐部中有两个独立的:has_many关系?像这样:

class Club < ActiveRecord::Base
  has_many :home_matches, :class_name => "Match"
  has_many :away_matches, :class_name => "Match"
end

我也试过这个,但它也不起作用。

2 个答案:

答案 0 :(得分:0)

您正在构建多对多关系,因此您需要一个链接表。而不是在你的任何一个实体表中都有外键,这个表存储了这些关系,除了match_id和club_id之外什么都没有,以关联这两个表。然后你可以使用

class Club < ActiveRecord::Base
    has_many :matches, :through => :matches_clubs
end

在此处查看更多信息 http://api.rubyonrails.org/classes/ActiveRecord/Associations/ClassMethods.html

答案 1 :(得分:0)

您是否在架构中将关系定义为home_club_idaway_club_id?因为看起来rails试图让match.club_id明显与您需要的模型冲突

我认为你的模型是错的,应该修改。 俱乐部不应该有match_id

匹配应该是:

  • home_club_id
  • away_club_id
  • 时间
  • 得分

俱乐部应该是:

  • 名称
  • 城市

我认为如果你从俱乐部中删除属于你,你应该没事。

如果您希望能够club.matches。 您可能必须编写一个查看home_club和away_club列的自定义SQL查询。或者为俱乐部制作关系表 - &gt;如果俱乐部在家或离开,那么有一个额外的metafield的比赛。虽然你在比赛桌上有家庭和客场俱乐部