一种风格有很多评论。
假设我正在做:
Style.select('styles.id').
joins(:reviews).
select('reviews.style_id, count(reviews.id) AS review_count')
...但我也想知道评论的总数!是否也可以提取该信息。我尝试将 count(*) 作为 total_reviews,但这仍会返回每种样式的评论数。
一种风格有很多评论。
假设我正在做:
Style.select('styles.id').
joins(:reviews).
select('reviews.style_id, count(reviews.id) AS review_count')
...但我也想知道评论的总数!是否也可以提取该信息。我尝试将 count(*) 作为 total_reviews,但这仍会返回每种样式的评论数。
如果您在 SQL 中思考,那么您正在构建很多行(嗯,该行的一个子集),并且在每一行中,您都在为该行计数。
另一方面,你想要一个总数。哪些检索到的记录应该具有该总数以及在哪个列/属性中?
并不是你不能在 Rails 中做到这一点,而是你不能在 SQL 本身中做到这一点。结果集完全不同,因此您需要两个查询,因此您需要两个 ActiveRecord 调用。
解决此问题的另一种方法(同样,您需要两个单独的查询,但它们更简单)是使用 counter_cache @style.reviews
:
# add a 'reviews_count' integer column to the 'styles' table and use it as
# a counter cache as follows
class Review < AR::Base
belongs_to :style, :counter_cache => true
end
现在您无需连接即可获得计数,并且可以通过简单的总和获得总计数。
附录:要使用 ocounter 缓存,styles
像往常一样查询表(不包括包含或连接),然后调用
@style.reviews.size
每当您想获得评论的数量时。这不会进行另一个查询,而是会使用@style
实例本身的缓存计数器。