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

时间:2020-01-26 22:20:04

标签: ruby-on-rails ruby join single-table-inheritance

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

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

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

1 个答案:

答案 0 :(得分:3)

如果您只需要将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),加上下划线。

相关问题