我想用自定义选择和连接修复我的N + 1计数问题。 我的帖子和标签之间有多对多的关系。标签可以被确认或未被确认。 我想在我的帖子select语句中包含字段tags_confirmed_count和tags_unconfirmed_count(所以我可以避免以后为每个问题计算标签)。
我已经为以下查询的帖子执行了计数标记:
Post.joins(:tags).select("posts.*, COUNT(tags.id) AS tags_count").group("posts.id")
现在,对于将字段确认设置为true且一次为false的标记,我找不到计数标记的解决方案。
我试过这种方式,但是我这样我只计算确认的那些,但不是未经证实的那些:
Post.joins(:tags).select("posts.*, COUNT(tags.id) AS tags_confirmed_count").group("posts.id").where("tags.confirmed = true")
答案 0 :(得分:3)
在真正的SQL中,不是Rails-ish,你会写:
SELECT
count(CASE WHEN confirmed THEN 1 END) AS n_confirmed,
count(CASE WHEN NOT confirmed THEN 1 END) AS n_unconfirmed,
...
FROM posts
...
希望能帮到你。不知道如何/如果可以将其转换为ActiveRecord-speak。