当我使用此请求时
@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
答案 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