在实现单个表继承的两个Rails模型上执行联接

问题描述 投票:0回答:1

我有三个模型。我们称它们为ProductTemplateProductReadyProduct。这些表只有一个表products表,TemplateProductReadyProduct都继承自Product模型。 TemplateProductReadyProduct之间存在has_many / belongs_to关联。模板用于布置产品的一般特征,Ready用来定制产品以及客户可以实际查看的内容。每个TemplateProduct都有一个id,每个ReadyProduct都有一个与其模板相关联的template_product_id

该项目是使用Rails 5构建的。

我想要做的是收集TemplateProduct的列表,然后获得与ReadyProduct相关的每个模板的计数,并且这样做的方式不会影响数据库。我了解ActiveRecord关联,但是我的SQL薄弱,对联接的理解也很有限。我可以用简单的TemplateProduct来收集Product.where(conditions的列表),但是一旦有了它,我就不知道该怎么做。为了灵活起见,我希望能够基于此初始集合计算ReadyProduct计数,因为有时我需要额外的计数,而有时则不需要。我敢肯定必须有一种简单的方法来做到这一点,但我还没有找到解决方案。

ruby-on-rails ruby join single-table-inheritance
1个回答
0
投票

如果您只需要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),并带有下划线。


© www.soinside.com 2019 - 2024. All rights reserved.