1

と の 2 つのモデルがQuestionありAnswerます。

答えが0の質問の数を見つけたいです。

だから私はこのようなものを試しましたが、うまくいきませんでした:

Question.where("answers.count = 0").count

Question.where("answers.count", 0).count

Question.joins(:answers).where("answers.count == 0").count

および他のいくつかの順列。

どうすれば欲しいものを手に入れることができますか?

4

4 に答える 4

4

エドワードの答えは機能しますが、純粋なSQLでこれを行うことができます。

Question.joins('LEFT OUTER JOIN answers.id ON answers.question_id = questions.id').group("questions.id").having("count('answers.id') = 0")

ただし、答えのない質問の総数だけが必要な場合は、ActiveRecord メソッドでそれを行うことはできないと思います。SQL ステートメントを自分で作成する必要があります。

Question.find_by_sql(
   "select count(id) as total from (
       select questions.*, count(answers.id) from questions 
       left outer join answers on answers.question_id = questions.id 
       group by questions.id having count(answers.id) = 0) 
    as noanswers").first.total
于 2013-03-23T13:27:17.857 に答える
3
Question.select('questions.*, COUNT(questions.id) AS question_count').joins('LEFT OUTER JOIN questions ON questions.answer_id = answers.id').group('answers.id').select { |a| a.question_count == 0}.count

あなたが望むものを手に入れます。しかし、それは少し悪夢のようなものです - 何かが足りないのではないでしょうか?

多くの複雑なクエリを実行したい場合は、squeel を検討する価値があります - https://github.com/ernie/squeel

または、回答の数を数えたいだけの場合は、 counter_cache http://api.rubyonrails.org/classes/ActiveRecord/Associations/ClassMethods.htmlを使用できます

カウンター キャッシュを追加する方法に関するブログ投稿は次のとおりです。

編集純粋なSQLの答えを指摘してくれた@boulderに感謝

Question.joins('LEFT OUTER JOIN answers ON answers.question_id = questions.id').group('questions.id').having("count('answers.id') = 0").count
于 2013-03-23T13:20:38.380 に答える
0

コマンドラインで実行しているだけで、パフォーマンスを気にしない場合は、 Question.all.map(&:id) - Answer.all.map(&:question_id).uniq を実行して取得しますすべての質問 ID。基本的に、すべての質問を選択し、それらの質問 ID を見つけて、すべての質問 ID のセットからそのセットを差し引きます。残っているのは、答えのない質問です。

于 2013-03-23T18:44:36.430 に答える
0
Question.find_by_sql('select * from questions where (select count(*) from answers where question_id = question.id) = 0').count
于 2013-03-24T02:57:27.460 に答える