加入不是相关领域

时间:2017-09-10 10:27:22

标签: ruby-on-rails ruby join activerecord

我有两种模式:
问题(身份证,文字,部分,因素)
答案(id,question_id,已选中)

问题has_many:答案 回答belongs_to:问题

我的目标是找到问题的因素 text 等于回答选择的字段,我只从答案中搜索

为了表明我的意思是SQL,它提供了我期望的结果

std::vector<int> append_negatives(std::vector<int> v) {
    v.reserve(v.size()*2);
    for(int &x: v) v.push_back(x);
    return v;
}

在rails中我尝试使用连接

SELECT questions.factor FROM answers INNER JOIN questions 
ON questions.text = answers.selected WHERE answers.id = 5

但结果并不准确,因为我在控制台栏中可以看到包括相关字段连接&#34;问题&#34;。&#34; id&#34; =&#34;答案&#34;。&#34; question_id&#34;

answers.joins(:question).where('questions.section = 4').where
('answers.selected = questions.text')

嗯,我相信Ruby的魅力应该在这里工作,请建议我一些精彩的方法来获得想要的结果。

感谢。

2 个答案:

答案 0 :(得分:2)

使用answers.joins(:question)将始终生成INNER JOIN "questions" ON "questions"."id" = "answers"."question_id",因为这是belongs_to :question中定义Answer关联的方式。

但是您可以根据需要将字符串传递给join。这样的事情(where条件可能需要额外的id = 5):

answers.joins('INNER JOIN questions ON questions.text = answers.selected')

答案 1 :(得分:1)

@spickermann的回答是现货!请充分诚意,请使用它。但是,有了这个问题,我开始使用Arel来讨论如何做同样的事情并提出:

custom_join = Answer.joins(:questions).on('questions.text = answers.selected').join_sources
# above will return an array with an inner join representation in Arel
Answer.joins(custom_join).where('questions.section = 4')
#=> ActiveRecord::Relation result