0

一种风格有很多评论

假设我正在做:

Style.select('styles.id').
    joins(:reviews).
    select('reviews.style_id, count(reviews.id) AS review_count')

...但我也想知道评论的总数!是否也可以提取该信息。我尝试将 count(*) 作为 total_reviews,但这仍会返回每种样式的评论数。

4

1 回答 1

1

如果您在 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实例本身的缓存计数器。

于 2012-11-06T10:29:19.463 回答