我正在尝试与多个来源创建has_many through
关系。
例如,游戏有home_team
和away_team
,并且锦标赛有多个游戏。
使用has_many游戏关系让锦标赛中所有球队参赛的最佳方法是什么。
现在我的代码看起来像这样:
class Tournament
has_many :teams, :through => :games, :source => :home_team, :uniq => true
end
但我希望某种方式让它像:
class Tournament
has_many :teams, :through => :games, :source => [:home_team, :away_team], :uniq => true
end
编辑:多对多的关系不是我的问题。是否有一个很好的方法让比赛中的所有球队都采用如下结构。
class Game
has_and_belongs_to_many :tournaments
belongs_to :home_team, :class_name => Team, :foreign_key => :home_team_id
belongs_to :away_team, :class_name => Team, :foreign_key => :away_team_id
end
class Tournament
has_and_belongs_to_many :games
end
有没有办法Tournament.teams
?
答案 0 :(得分:4)
在花了一些时间试图找到内置解决方案后,我最终在游戏中编写了一个名为团队的自定义查询。它通过team_1和team_2两次将团队加入游戏,并检查是否有任何游戏ID列表都在这两个连接中的任何一个。
这个解决方案不是很好,因为它需要多个查询(其中一个只是所有游戏ID的巨大列表),但我花了很多时间试图想出另一种方式而不能。至少这种方式有效。
我很想学习更好的方法。
游戏内的代码:
def self.teams
joined_tables = Team.joins(:home_team).joins(:away_team)
joined_tables.where('games.id in (?) or away_team_games.id in (?)',
select(:id), select(:id)).uniq
end
答案 1 :(得分:-3)
定义这样的模型:
class Tournament
has_many :games
has_many :teams, :through => :games
end
class Game
belongs_to :torunament
belongs_to :team
end
class Team
has_many :games
has_many :tournaments, :through => :games
end
然后在控制器或任何地方打电话:
tournament.teams
编辑:
您可以在scope
模型中为此类问题定义Tournament
。这更像是一些自定义查询,而是由开箱即用的rails支持。或者至少我现在不记得了。
你可以看看如何使用它们。
http://guides.rubyonrails.org/active_record_querying.html http://apidock.com/rails/ActiveRecord/NamedScope/ClassMethods/scope http://ablogaboutcode.com/2011/02/19/scopes-in-rails-3/
您可以构建一个可以获得所有团队的查询。您可以创建任何您喜欢的查询。