[英]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.