2017-09-19 1 views
1

Wie diese SQL-on Rails ActiveRails Abfrage mit INNER JOIN

select * from interview_questions as iq inner join (select * from interview_answers as iaa where iaa.case_id=6 and iaa.used='t') as ia where iq.id = ia.interview_question_id;

Ruby schreiben? Ein interview_questions hat viele interview_answers, ist eine 1 zu N Beziehung. Ich möchte die Liste von InterviewQuestion erhalten, die diese SQL-Abfrage normalerweise zurückgeben würde.

+0

Ein interview_questions hat viele interview_answers? Und interview_answers gehört zu vielen interview_questions? Kurz ist es eine N für N Beziehung? –

+0

Ja, ein interview_questions hat viele interview_answers Es ist eine 1 zu N Beziehung. –

+0

Eine Antwort kann nicht zu vielen Fragen gehören? –

Antwort

1

Unter der Annahme, dass Sie eine 1 bis N Beziehung zwischen Ihren Modellen haben Sie die has_many Verband wie diese verwenden müssen:

http://guides.rubyonrails.org/association_basics.html#the-has-many-association

Rails führt, erklärt:

A has_many Assoziation a zeigt Eins-zu-viele-Verbindung mit einem anderen Modell. Sie finden diese Assoziation oft auf der "anderen Seite" einer assignes_to-Assoziation. Diese Zuordnung gibt an, dass jede Instanz des Modells null oder mehr Instanzen eines anderen Modells aufweist. Zum Beispiel in einer Anwendung Autoren und Bücher enthält, könnte der Autor Modell wie folgt erklärt werden:

Sie wahrscheinlich Gonna Notwendigkeit, dies zu tun:

class interview_questions < ApplicationRecord 
    has_many :interview_answers 
end 

class interview_answers< ApplicationRecord 
    belongs_to :interview_questions 
end 

Danach müssen Sie eine Migration schaffen Fügen Sie in Ihrem interview_answers-Modell einen foreing-Schlüssel hinzu.

rails generate migration add_interview_questions_to_interview_answers interview_questions:references 

Schließlich Sie Verband Helfer wie

interview_questions.first.interview_answer.where(case_id: 6).where(used: 't') 

Denken Sie daran, dass dies nur ein Beispiel verwenden können, müssen Sie wahrscheinlich ein paar kleinere Dinge anzupassen. Viel Glück!

1

Nachdem die Assoziationen wie von @ Gabriel Mesquita vorgeschlagen durchgeführt wurden, brauchte ich dies, um meine Aufgabe zu erledigen.

InterviewQuestion.where(id: InterviewAnswer.where(case_id: params[:case_id], used: 't').pluck(:interview_question_id)) 

war der Ruby on Rails-Code, den ich suchte. Es wählt alle interviews_questions aus, die eine interview_answer-Datei haben, die der aktuellen case_id entspricht, und die used-Menge auf "t".

+0

Schön! Gut gemacht. –