我想通过自定义选择和联接解决我的N + 1计数问题。我的帖子和标签之间存在多对多关系。标签可以确认也可以不确认。我想在我的帖子选择语句中包括标签字段tag_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")
在真正的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。