我有三个模型。我们称它们为Product
,TemplateProduct
和ReadyProduct
。这些表只有一个表products
表,TemplateProduct
和ReadyProduct
都继承自Product
模型。 TemplateProduct
和ReadyProduct
之间存在has_many / belongs_to关联。模板用于布置产品的一般特征,Ready用来定制产品以及客户可以实际查看的内容。每个TemplateProduct
都有一个id
,每个ReadyProduct
都有一个与其模板相关联的template_product_id
。
该项目是使用Rails 5构建的。
我想要做的是收集TemplateProduct
的列表,然后获得与ReadyProduct
相关的每个模板的计数,并且这样做的方式不会影响数据库。我了解ActiveRecord关联,但是我的SQL薄弱,对联接的理解也很有限。我可以用简单的TemplateProduct
来收集Product.where(conditions
的列表),但是一旦有了它,我就不知道该怎么做。为了灵活起见,我希望能够基于此初始集合计算ReadyProduct
计数,因为有时我需要额外的计数,而有时则不需要。我敢肯定必须有一种简单的方法来做到这一点,但我还没有找到解决方案。
如果您只需要TemplateProduct
个ID到ReadyProduct
个计数的映射,那么您所需要做的就是:
TemplateProduct.joins(:ready_products).group(:id).count
如果您希望TemplateProduct
实例具有ReadyProduct
计数,那么您将需要此:
tps = TemplateProduct.joins(:ready_products).select('products.*, COUNT(ready_products_products.id) ready_product_count').group(:id)
tps.first.ready_product_count
#=> 6
[ready_products_products
由Rails定义,它在实际表名(products
)的前面加上模型名的“表形式”(复数,蛇形,小写,ready_products
),并带有下划线。