Rails-如何建立has_many through可以是多列的关系



我离开rails开发世界已经有一段时间了,在设置表之间的关系和联接时有点生疏,所以如果这是一个非常简单的问题,我很抱歉。

  • 我有一个具有id列的Team模型
  • 我有一个Match型号,它有home_team_idaway_team_id
  • 我想打电话给@team.matches,有任何Match其中CCD_ 8或CCD_@team.id出现

我可以通过下面的查询实现它,但这还远远不够理想。

@matches = Match.where(home_team_id: @team.id) || Match.where(away_team_id: @team.id))

那么,建立我的模型和关系以实现上述行为的建议方法是什么?

提前感谢!

这是受@Joel_Blum的回答启发。我认为它更干净一些,并通过home_matches和away_matches范围扩展了实用程序:

class Match < ApplicationRecord
belongs_to :home_team, class_name: "Team"
belongs_to :away_team, class_name: "Team"
end
class Team < ApplicationRecord
has_many :home_matches, foreign_key: :home_team_id, class_name: "Match"
has_many :away_matches, foreign_key: :away_team_id, class_name: "Match"

def matches
home_matches.or(away_matches)
end
end

我在模型中对以下内容进行了类似的处理:

def matches
Match.where('home_team_id = ? OR away_team_id = ?', self.id, self.id)
end

这至少给了你一个范围。然后在您的控制器中:

@matches = @team.matches

我对任何其他想法都感兴趣。

这是一个可能的模型设置

class Match < ApplicationRecord
belogns_to :home_team, class_name: "Team"
belongs_to :away_team, class_name: "Team"
end
class Team < ApplicationRecord
has_many :matches,-> {
unscope(:where).where(home_team_id: self.id).or(where(away_team_id: self.id))
}
end

现在@team.matches应该可以工作了。唯一棘手的部分是让has_many通过执行unscope(:where(来处理2个外键

相关内容

  • 没有找到相关文章

最新更新