Ruby on rails 通过多个来源获得了许多信息

Ruby on rails 通过多个来源获得了许多信息,ruby-on-rails,Ruby On Rails,我正试图创建一个与多个来源有着千丝万缕联系的 例如,一场比赛有主队和客队,而一场锦标赛有多场比赛 什么是最好的方式,让所有的球队在比赛中使用一个有很多通过比赛的关系 现在,我的代码如下所示: class Tournament has_many :teams, :through => :games, :source => :home_team, :uniq => true end class Tournament has_many :games has_many :

我正试图创建一个与多个来源有着千丝万缕联系的

例如,一场比赛有
主队
客队
,而一场锦标赛有多场比赛

什么是最好的方式,让所有的球队在比赛中使用一个有很多通过比赛的关系

现在,我的代码如下所示:

class Tournament
  has_many :teams, :through => :games, :source => :home_team, :uniq => true
end
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
但我想用某种方式让它表现得像:

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

有没有一种方法可以进行
锦标赛。团队

定义如下模型:

class Tournament
  has_many :teams, :through => :games, :source => :home_team, :uniq => true
end
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
编辑:

您可以在您的
锦标赛
模型中为此类问题定义
范围
。这更像是一些定制查询,而不是rails开箱即用的支持。或者至少我现在记不起来了

你可以看看如何使用它们


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

在花了一些时间试图找到一个内置的解决方案之后,我刚刚编写了一个名为“游戏中的团队”的自定义查询。它通过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
放进去,却没有理由放进去。其中接受的解决方案有一个丑陋的自定义查询。我没有投你反对票,但公平地说,你的回答没有像我之前的评论所指出的那样接近于回答我的问题。我不认为没有丑陋的质疑就有办法做到这一点。不确定情况是否仍然如此,因为我已经有一段时间没有使用rails了。是的,好的,我知道了。从某种意义上说,我没有使用过你的模型名,比如
away\u team
home\u team
,我现在可以看到,但是在Rails中,如果你像下面那样编写查询,那么你肯定知道你走错了路,与Rails一样,大多数情况下,一切都可以以干净、友好的方式完成。有一个类似的问题,最终改变了我的模式以解决它,但我看到的一个选项是使用
。merge
Edit:进一步考虑它,我打赌rails的方法是单表继承,主客场游戏都有一个父抽象类
Game
,提供连接表。下次我会试试:)