1

我有两个模型 -QuestionAnswer.

我想找出有 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

虽然 Edward 的回答有效,但您可以并且应该使用纯 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

这是一篇关于如何添加计数器缓存的博客文章http://blog.obiefernandez.com/content/2011/08/adding-a-counter-cache-to-existing-records.html

编辑感谢@boulder 指向纯sql 答案

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 回答