【问题标题】:Joins not by related field不按相关字段连接
【发布时间】:2018-02-18 18:00:06
【问题描述】:

我有两个模型:
问题(id、文本、部分、因素)
答案(id,question_id,selected)

问题 has_many :answers 回答belongs_to :question

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

为了表明我的意思是 SQL 给出了我的预期结果

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

在 Rails 中我尝试使用连接

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

但结果并不准确,正如我在控制台导轨中看到的那样,包括相关字段的连接 "questions"."id" = "answers"."question_id"

SELECT "answers".* FROM "answers" INNER JOIN "questions" ON
"questions"."id" = "answers"."question_id" WHERE "answers"."participant_id" = $1 
AND (questions.section = 4) AND (answers.selected = questions.text)

好吧,我相信 Ruby 的魅力应该在这里发挥作用,请指教我一些获得想要的结果的绝妙方法。

谢谢。

【问题讨论】:

    标签: ruby-on-rails ruby join activerecord


    【解决方案1】:

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

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

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

    【讨论】:

    • 哇。从来不知道 join 接受了这样的条件。
    【解决方案2】:

    @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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-07-15
      • 1970-01-01
      • 2021-01-11
      • 1970-01-01
      • 2018-12-30
      相关资源
      最近更新 更多