我有三个模型,我们称它们为Product
,TemplateProduct
和ReadyProduct
。 这些表只有一个表,即products
表,TemplateProduct
和ReadyProduct
都继承自Product
模型。TemplateProduct
和ReadyProduct
之间存在has_many/belongs_to关联。 模板用于布置产品的一般特征,Readys 用于自定义产品以及实际可供客户查看的内容。 每个TemplateProduct
都有一个id
,每个ReadyProduct
都有一个与其模板相关的template_product_id
。
该项目是使用 Rails 5 构建的。
我希望能够做的是收集TemplateProduct
的列表,然后获取ReadyProduct
关联的每个模板的计数,并以不会锤击数据库的方式进行。 我了解 ActiveRecord 关联,但我的 SQL 很弱,我对连接的理解有限。 我可以用一个简单的Product.where(conditions
收集TemplateProduct
的列表,但我不知道一旦我有了这个该怎么做。 为了灵活性的考虑,我希望能够基于这个初始集合进行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
(,并带有下划线。