使用左连接时,主键为null

时间:2015-05-06 09:55:48

标签: ruby-on-rails ruby left-join rails-activerecord

当我使用此请求时

@questions = Question.joins("left join answers as a on a.user_id = #{current_user.id} and a.question_id = questions.id").select('questions.*, a.*')

Question.id为空。有谁知道为什么?也许它需要一个别名或类似的东西。

我的架构:

class Answer:
  belong_to: User
  belongs_to: Question
end

class User:
  has_many: answers
end

class Question:
  has_one: answer
end

2 个答案:

答案 0 :(得分:2)

问题是答案表可能还有一个名为id的列,它会影响问题的ID。虽然在结果集中,一列称为questions.id,另一列称为a.id,但活动记录只是查看最后一部分('id')

我知道除了来自答案表中有问题的列之外没有其他好处,不幸的是这意味着明确地命名所有这些列(尽管你当然可以自动化这一点)

答案 1 :(得分:1)

这可能是因为两个表的ID列相互冲突。

<强>更新

只需更改选择列的顺序即可。因此,请尝试.select("questions.*", "answers.*")

而不是.select("answers.*", "questions.*")

旧回答:

尝试以下方法:

# Assuming the following:
#   Question.table_name == "questions"
#   Answer.table_name == "answers"

question_columns = Question.column_names # or %w{questions.*}
answer_columns = Answer.column_names.map { |c| "answer_#{c}" }
columns = question_columns + answer_columns
@questions = 
  Question.
  joins("LEFT OUTER JOIN answers ON (
    answers.question_id = questions.id
    AND
    answers.user_id = #{current_user.id}
  )").
  select(*columns)
@questions.first.id #=> should return some integer
@questions.first.answer_id #=> may or may not return something

但是,除非您绝对需要LEFT JOIN以及这些选择列,否则使用以下内容完成任务将更加清晰:

class Answer
  belongs_to :question
end

class User
  has_many :answers
  has_many :questions, through: :answers
end

current_user.questions