2017-02-12 89 views
0

我相信我的措辞不是很好,这解释了为什么我在搜索失败。我试图找出如何识别与其他两个相关的记录。例子会使它更清晰。如何识别包含Ruby on Rails相关记录的模型?

模型比赛 has_many与结果。结果有一个团队号码(但可以使用字母作为清晰度)

因此,在此示例中,我试图找出A队和D队都参加过的所有比赛。

我想找回所有符合这个条件的比赛的调查员,然后我可以将两个队伍相互比较。

我很抱歉,这不是最好的写作,我正在努力的条款来定义我想要做的事情。感谢您的帮助,时间和耐心!

回答

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 

这将设置你的协会,并让你从Team访问Contestdelegate方法说:“如果我拨打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 })

+0

感谢您!我应该列入包括我已经建立了模型,但现在很高兴我没有!我不知道在模型中的代表,总是用“通过:”选项底部的代码是非常赞赏的回答这个问题为好,感谢你,我给它一个去! – MechDog

0

问题是你需要与A队参加同一个表两次,一次结果和一次与团队B的结果。您需要将它们作为单独的表格引用。您可以使用阿雷尔和分配唯一的名称表中的两个实例。

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