我在解决我需要获得objects from objects in one query的问题时获得了一些非常好的帮助。这就像一个魅力。
这是对这个问题的跟进。我选择为此创建一个新问题,因为根据我之前的规范回答了最后一个问题。有关详细信息,请参阅上一个问题。
基本上,我想在一个查询中获取多个对象的所有对象。例如。如果一个产品有几个类别,而这些类别又有几个产品,我希望得到这个关系中的所有产品,更容易(和错误):
all_products = @my_product.categories.products
这是通过此查询解决的。我想(最好)改变这个查询:
Product.includes(:categories).where(categories: { id: @my_product.categories.pluck(:id) } )
现在,我意识到我错过使用此解决方案的一件事是我只获得了一系列独特的产品(也是人们所期望的)。不过,我想获取可能重复的列表。
基本上,如果类别中包含“蓝色电动车”(“蓝色”,“电动”和“汽车”),我希望返回该对象的三个实例,而不是一个唯一的实例。
我想这不会使Rails有意义,但有没有办法改变上面的查询,以便它不会为我提供返回列表中的唯一对象列表,而是“完整”列表?
答案 0 :(得分:2)
AREL的System
方法将在两个策略之间进行选择,其中一个只执行两个不同的查询,另一个执行INNER JOIN。
在这两种情况下,产品都是不同的。
您必须手动执行右外连接:
includes
如果您想保持对类别的热切加载,还会添加Product.joins('RIGHT JOIN categories ON categories.product_id = products.id').where(categories: { id: @my_product.categories.pluck(:id) } )
。
答案 1 :(得分:1)
由于您需要重复项,只需将includes
更改为joins
,(我刚刚对其进行了测试)。 joins
将基本上组合(内部联接)两个表,为您提供所有唯一的记录列表(每个产品和类别)。 includes
执行热切加载,它只加载关联的表但是进行了外连接,因此,检索到的记录也是唯一的(但只有每个产品)。
Product.joins(:categories).where(categories: { id: @my_product.categories.pluck(:id) } )