0

我正在为“问答”论坛制作 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

我在上面的第二个 join 命令中用答案替换了 micropost,但它抱怨没有这样的表。如何进行两次连接?-谢谢。

4

1 回答 1

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用于 的别名microposts不是。

在这里,我们定义它mmicropoststable 的别名,以表明它与您在使用之前加入的 table 不同a.question_id = microposts.id(这里 microposts 是micropoststable 的第一个“实例”,在下一个 JOIN 中,您定义另一个实例给别名m)。

不确定我是否解释清楚,请看这里:

SELECT e.name, mgr.name
  FROM employees e
    JOIN employees mgr ON (e.manager_id = mgr.id)
;

在这里,我们再次有两个员工表实例 - 我们将两个表中的行连接起来以获取员工姓名和他的经理姓名。此处需要别名,否则将不清楚哪一列取自哪个表。

如果您想了解有关 JOIN 的更多信息,可以阅读:

http://www.w3schools.com/sql/sql_join.asp

或者(有更多关于 JOIN 的链接,很好地展示和解释,希望它对你有用):

“INNER JOIN”和“OUTER JOIN”有什么区别?

于 2013-10-10T08:29:19.717 回答