使用左连接时主键为空

Primary key is null when left join is used

当我使用这个请求时

@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

问题是答案 table 可能还有一个名为 id 的列,它隐藏了问题的 ID。尽管在结果集中一列称为 questions.id 而另一列称为 a.id,但活动记录只查看最后一部分 ('id')

据我所知,除了从答案 table 中为有问题的列添加别名外,没有其他好的解决方法,不幸的是,这意味着明确命名所有这些列(尽管您当然可以在一定程度上自动执行此操作)

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

更新:

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

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

旧答案:

尝试以下操作:

# 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 以及那些 select 列,否则使用以下方法完成您的任务会更清晰:

class Answer
  belongs_to :question
end

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

current_user.questions