我有两个模型 -Question
和Answer
.
我想找出有 0 个答案的问题的数量。
所以我尝试了这样的东西,但没有奏效:
Question.where("answers.count = 0").count
Question.where("answers.count", 0).count
Question.joins(:answers).where("answers.count == 0").count
和其他一些排列。
我怎样才能得到我想要的?
我有两个模型 -Question
和Answer
.
我想找出有 0 个答案的问题的数量。
所以我尝试了这样的东西,但没有奏效:
Question.where("answers.count = 0").count
Question.where("answers.count", 0).count
Question.joins(:answers).where("answers.count == 0").count
和其他一些排列。
我怎样才能得到我想要的?
虽然 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
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
如果您只是在命令行上执行此操作并且不关心性能,那么我只需执行 Question.all.map(&:id) - Answer.all.map(&:question_id).uniq 即可所有问题的 ID。基本上,您要选择所有问题,找到它们的问题 ID,然后从所有问题 ID 的集合中减去该集合。剩下的就是没有答案的问题。
Question.find_by_sql('select * from questions where (select count(*) from answers where question_id = question.id) = 0').count