Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby-on-rails-4/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 使用“两个”与同一模型有一个关系_Ruby On Rails_Ruby On Rails 4_Has Many_Has One - Fatal编程技术网

Ruby on rails 使用“两个”与同一模型有一个关系

Ruby on rails 使用“两个”与同一模型有一个关系,ruby-on-rails,ruby-on-rails-4,has-many,has-one,Ruby On Rails,Ruby On Rails 4,Has Many,Has One,我正试图找到最好的方法来模拟一场与球队相关的比赛 最终目标是能够调用以下内容: @game.winner @game.loser @team.games 前两种关系正在发挥作用,但第一种关系不起作用。使用has\u many(见下文),我会得到错误:column games.team\u id不存在,我通常会使用与:foreign\u key=>winner\u id等效的任何东西来解决这个问题,但我如何让它同时签出winner\u id和loser\u id 是在团队模型中创建方法的唯一选项

我正试图找到最好的方法来模拟一场与球队相关的比赛

最终目标是能够调用以下内容:

@game.winner
@game.loser
@team.games
前两种关系正在发挥作用,但第一种关系不起作用。使用has\u many(见下文),我会得到
错误:column games.team\u id不存在
,我通常会使用与
:foreign\u key=>winner\u id
等效的任何东西来解决这个问题,但我如何让它同时签出
winner\u id
loser\u id

是在团队模型中创建方法的唯一选项,如下所示:

def games
  won = Game.where(:winner => id)
  lost = Game.where(:loser => id)
  won + lost
end
到目前为止,我正在做的是:

class Game < ActiveRecord::Base
  has_one :winner, class_name: "Team"
  has_one :loser,  class_name: "Team"
end


class Team
  has_many :games
  # or something that actually works
end
类游戏
关于这个问题,你没有说太多。但我认为你工作太努力了。如果一个团队可以玩多个游戏,并且一个游戏包含多个团队,那么您需要一个多对多关系。这需要第三个表,最佳实践是一个
has\u many:through
关系。它将看起来像:

class Game < ActiveRecord::Base
  has_many :teams, through: assignment
  has_one :winner, class_name: 'Team', through: :assignment, order: 'score DESC'
  has_one :loser,  class_name: 'Team', through: :assignment, order: 'score ASC'
end

class Team
  has_many :games, through: :assignment
end

class Assignment < ActiveRecord::Base
  belongs_to :game
  belongs_to :team
end
类游戏

现在你有了赢家和输家的属性,但是你不需要使用自己的方法来计算一个团队的比赛。只需说
team.games.count
和类似的
game.teams
是分配给游戏的团队。

可能的重复:不,我的是,但我想要两个外键,但实际上可能是一个副本。我会做一些与答案类似的事情,但是,将其作为一个或条件范围来编写,而不是将两个结果连接起来,因此我必须为连接表添加一个迁移?嗯,您确实想要生成一个模型,而不仅仅是一个迁移<代码>rails g模型分配游戏:参考团队:参考