我离开rails开发世界已经有一段时间了,在设置表之间的关系和联接时有点生疏,所以如果这是一个非常简单的问题,我很抱歉。
- 我有一个具有
id
列的Team
模型 - 我有一个
Match
型号,它有home_team_id
和away_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个外键