10

我正在尝试has_many through与多个来源建立关系。

例如,一个游戏有一个home_teamaway_team一个锦标赛有多个游戏。

使用 has_many through games 关系让所有球队参加比赛的最佳方法是什么。

现在我的代码如下所示:

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吗?

4

2 回答 2

4

在花了一些时间试图找到一个内置的解决方案后,我最终编写了一个名为 team in games 的自定义查询。它通过 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
于 2013-03-19T01:27:12.840 回答
-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/

您可以建立一个可以获取所有团队的查询。您可以创建任何您喜欢的查询。

于 2013-03-08T13:06:53.537 回答