使用左连接时主键为空
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
当我使用这个请求时
@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