0

「質問と回答」フォーラム用の Rails 4 アプリを作成しています。私はモデルのマイクロポストを持っています。さまざまなマイクロポストを質問と回答として接続するモデル 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

次に、データベース クエリを実行します。2 つの 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

上記の 2 番目の joins コマンドでマイクロポストを回答に置き換えましたが、そのようなテーブルがないと不平を言っています。2つの結合を行うにはどうすればよいですか? -ありがとう。

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はそうではありません。

ここでは、使用する前に結合するテーブルとは異なるテーブルであることを通知する tablemのエイリアスを定義します(ここでは、マイクロポストは table の最初の「インスタンス」であり、次の JOIN では、指定する別のインスタンスを定義しますエイリアス) 。micropostsa.question_id = microposts.idmicropostsm

これを明確に説明したかどうかわからない場合は、こちらをご覧ください。

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

ここでも、employees テーブルの 2 つのインスタンスがあります。両方のテーブルの行を結合して、従業員の名前とマネージャーの名前を取得します。ここではエイリアスが必要です。そうしないと、どの列がどのテーブルから取得されたかが不明確になるためです。

JOIN について詳しく知りたい場合は、以下をお読みください。

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

または (JOIN に関するリンクがさらにあり、うまく表示および説明されています。役に立つことを願っています):

「INNER JOIN」と「OUTER JOIN」の違いは何ですか?

于 2013-10-10T08:29:19.717 に答える