2017-02-12 3 views
0

Ich bin sicher, meine Formulierung ist nicht großartig, was erklärt, warum ich bei der Suche versagt habe. Ich versuche herauszufinden, wie Datensätze identifiziert werden können, die sich auf zwei andere beziehen. Beispiel wird es klarer machen.Wie identifizieren Sie Modelle, die verwandte Datensätze in Ruby on Rails enthalten?

Modell Der Wettbewerb hat eine Beziehung has_many zu Ergebnisse. Die Ergebnisse haben eine Teamnummer (aber wir können Buchstaben für Clarity verwenden)

Also versuche ich in diesem Beispiel alle Wettbewerbe zu finden, an denen Team A und Team D teilgenommen haben.

Ich möchte einen Zähler aller Wettbewerbe zurückbekommen, die zu dieser Bedingung passen, damit ich die beiden Teams dann miteinander vergleichen kann.

Ich entschuldige mich dafür nicht das Beste zu schreiben, ich kämpfe um die Begriffe zu definieren, was ich versuche zu tun. Danke für Ihre Hilfe, Zeit und Geduld!

Antwort

0

Gegeben:

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 
Sie Contest von Team Dies wird richten Sie Ihre Verbände, und lassen Sie zugreifen. Die delegate Methode sagt "wenn ich rufe team.contest, tun team.result.contest stattdessen".

Hoffe, dass hilft!

EDIT

Und wenn Sie wollen, um die neuesten Informationen sammeln:

Contest.joins(results: :teams).where(teams: { id: team_a.id }) Contest.joins(results: :teams).where(teams: { id: team_b.id })

+0

Vielen Dank! Ich sollte die mitgelieferten die Modelle mit einschließen, die ich eingerichtet hatte, aber jetzt froh, dass ich nicht! Ich war mir nicht bewusst, der Delegierte auf einem Modell, immer die "durch:" Option. Der Code auf der Unterseite ist sehr dankbar für die Beantwortung der Frage auch, danke, ich werde es versuchen! – MechDog

0

Das Problem wird würden Sie zweimal den gleichen Tisch sitzen müssen, einmal mit Team A Ergebnisse und einmal mit Team B Ergebnissen. Sie müssen sie als separate Tabellen referenzieren. Sie können Arel verwenden und den beiden Instanzen der Tabelle eindeutige Namen zuweisen.

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