繁体   English   中英

使用Active Record在同一查询中提供联接计数和总数

[英]Providing a join count and total count in the same query with Active Record

一种风格有很多评论

假设我在做:

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

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

如果您考虑使用SQL,则要建立很多行(很好,是该行的一个子集),并且在每一行中都要对该行进行计数。

另一方面,您需要总数。 哪些检索记录应具有该总数,以及在哪个列/属性中?

并不是说您不能在rails中做到这一点,而是您不能在SQL本身中做到这一点。 结果集完全不同,因此您需要两个查询,因此需要两个ActiveRecord调用。

解决此问题的另一种方法(再次需要两个分离的查询,但它们更简单)是对@style.reviews使用counter_cache:

# 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

现在,您无需连接就可以拥有计数,并且总计数可以通过简单的求和而获得。

附录:要使用计数器缓存,请一如既往地查询styles表(不包含或联接),然后调用

@style.reviews.size

每当您想获得评论数时。 这不会进行其他查询,而是会在@style实例本身上使用缓存的计数器。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM