我正在建立一个足球比赛,我在创建俱乐部和比赛课时遇到了麻烦。我希望能够做到这一点:
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
我也试过这个,但它也不起作用。
答案 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_id
和away_club_id
?因为看起来rails试图让match.club_id
明显与您需要的模型冲突
我认为你的模型是错的,应该修改。
俱乐部不应该有match_id
。
匹配应该是:
俱乐部应该是:
我认为如果你从俱乐部中删除属于你,你应该没事。
如果您希望能够club.matches
。
您可能必须编写一个查看home_club和away_club列的自定义SQL查询。或者为俱乐部制作关系表 - &gt;如果俱乐部在家或离开,那么有一个额外的metafield的比赛。虽然你在比赛桌上有家庭和客场俱乐部