我正在为'问答'论坛制作一个rails 4应用程序。我有一个模型Micropost。我有一个模型QuestionAnswer连接不同的微博作为问题和答案:
Class Micropost < ActiveRecord::Base
has_many question_answers, foreign_key: "question_id"
has_many answers, through: :question_answers
has_one :reverse_question_answer, foreign_key: "answer_id", class_name: "QuestionAnswer"
has_one :question, through: :reverse_question_answer
end
Class QuestionAnswer < ActiveRecord::Base
belongs_to :question, class_name: "Micropost"
belongs_to :answer, class_name: "Micropost"
end
现在我想做一个数据库查询。我想使用两个LEFT OUTER JOIN来创建一个包含所有问题和答案的联合表:
Micropost.
joins('LEFT OUTER JOIN question_answers ON question_answers.question_id = microposts.id').
joins('LEFT OUTER JOIN microposts ON microposts.id = question_answers.answer_id')
我收到错误消息
SQLite3::SQLException: ambiguous column name: microposts.id SELECT "microposts".* FROM "microposts" LEFT OUTER JOIN question_answers ON question_answers.question_id = microposts.id LEFT OUTER JOIN microposts ON microposts.id = question_answers.answer_id ORDER BY created_at DESC
我用上面第二个连接命令中的答案替换了micropost,但它抱怨没有这样的表。我该怎么做两个连接? -Thanks。
答案 0 :(得分:3)
解决方案是使用以下代码:
Micropost.
joins('LEFT OUTER JOIN question_answers a ON a.question_id = microposts.id').
joins('LEFT OUTER JOIN microposts m ON m.id = a.answer_id')
根据您关于别名的问题,a
别名代表整个question_answers
表。在这个特定的例子中,它只是为了方便。但是,用于m
的{{1}}别名不是。
在这里,我们定义microposts
是m
表的别名,表示它与使用microposts
之前加入的表不同(此处微博是第一个' 'a.question_id = microposts.id
表的实例',并在下一个JOIN中定义另一个为microposts
别名提供的实例。
不确定我是否清楚地解释了这一点,请看这里:
m
这里我们再次有两个employees表实例 - 我们从两个表中连接行以获取员工的姓名和经理的姓名。这里需要别名,否则将不清楚哪个列取自哪个表。
如果您想了解有关JOIN的更多信息,请阅读:
http://www.w3schools.com/sql/sql_join.asp
或(还有关于JOIN的更多链接,很好地展示和解释,希望它对您有用):
What is the difference between "INNER JOIN" and "OUTER JOIN"?