使用内部联接进行Rails查询

时间:2017-09-19 18:41:41

标签: sql ruby-on-rails

如何编写此sql

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 on Rails ActiveRecord? interview_questions有很多interview_answers,是1到N的关系。我想获取此sql查询通常会返回的InterviewQuestion列表。

2 个答案:

答案 0 :(得分:1)

假设你的模型之间有1到N的关系,你需要像这样使用has_many协会:

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

Rails指南解释说:

  

has_many关联表示与另一个模型的一对多连接。您经常会在"其他方面找到这种关联"属于一个关联。此关联表示模型的每个实例都具有零个或多个另一个模型的实例。例如,在包含作者和书籍的应用程序中,作者模型可以声明为:

你可能需要这样做:

class interview_questions < ApplicationRecord
  has_many :interview_answers
end

class interview_answers< ApplicationRecord
  belongs_to :interview_questions 
end

之后,您需要创建一个迁移以在interview_answers模型中添加foreing密钥。

rails generate migration add_interview_questions_to_interview_answers interview_questions:references

最后,你可以使用像

这样的关联助手
interview_questions.first.interview_answer.where(case_id: 6).where(used: 't')

请记住,这只是一个例子,您可能需要调整一些小事情。祝你好运!

答案 1 :(得分:1)

按照@Gabriel Mesquita的建议完成协会后,我需要这个来完成我的任务。

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

是我寻找的Ruby on Rails代码。它选择所有具有与当前case_id相对应的interview_answer的interview_questions,并使用所使用的set来设置&#39;。