我确信我的措辞不是很好,这解释了为什么我没有在搜索中失败。我试图弄清楚如何识别与其他两个相关的记录。示例将使其更清晰。
模型比赛与结果具有has_many关系。结果有一个团队编号(但允许使用Clarity字母)
所以在这个例子中,我试图找到A队和D队都参加过的所有比赛。
我想找回所有适合这种情况的比赛的调查员,这样我就可以将两支队伍相互比较。
我为这不是最好的写作而道歉,我正在努力争取用于定义我尝试做的事情的条款。感谢您的帮助,时间和耐心!
答案 0 :(得分:0)
假设:
class Contest < ApplicationRecord
has_many :results
has_many :teams, through: :results
end
class Result < ApplicationRecord
has_many :teams
belongs_to :contest
end
class Team < ApplicationRecord
belongs_to :result
delegate :contest, to: :result
end
这将设置您的关联,并允许您从Contest
访问Team
。 delegate
方法显示“如果我致电team.contest
,请执行team.result.contest
”。
希望有所帮助!
修改强>
如果你想参加比赛:
Contest.joins(results: :teams).where(teams: { id: team_a.id })
Contest.joins(results: :teams).where(teams: { id: team_b.id })
答案 1 :(得分:0)
问题是你需要两次加入同一个表,一次是团队A的结果,一次是团队B的结果。您需要将它们作为单独的表引用。您可以使用Arel并为表的两个实例分配唯一的名称。
contests_between = Arel::Table.new(:contests, as: 'contests_between')
team_a_results = Arel::Table.new(:results, as: team_a_results)
team_b_results = Arel::Table.new(:results, as: team_b_results)
relation = contests_between.project(Arel.sql('*')).
join(team_a_results).on(contests_between[:id].eq(team_a_results[:contest_id])).
join(team_b_results).on(contests_between[:id].eq(team_b_results[:contest_id]))
And then you can do...
relation = relation.where(team_a_results[:team_id].eq(1)).where(team_b_results[:team_id].eq(2))
@contests = relation.to_sql
# above assumes team_a is id 1 and team_b is id 2... if the teams are already loaded you could substitute team_a.id and team_b.id