如何识别Ruby on Rails中包含相关记录的模型?

时间:2017-02-12 21:42:05

标签: ruby-on-rails activerecord

我确信我的措​​辞不是很好,这解释了为什么我没有在搜索中失败。我试图弄清楚如何识别与其他两个相关的记录。示例将使其更清晰。

模型比赛结果具有has_many关系。结果有一个团队编号(但允许使用Clarity字母)

所以在这个例子中,我试图找到A队和D队都参加过的所有比赛。

我想找回所有适合这种情况的比赛的调查员,这样我就可以将两支队伍相互比较。

我为这不是最好的写作而道歉,我正在努力争取用于定义我尝试做的事情的条款。感谢您的帮助,时间和耐心!

2 个答案:

答案 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访问Teamdelegate方法显示“如果我致电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