[使用带有活动记录的联接表时如何与模型的多个实例联接?

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

这是针对使用PostgreSQL的Rails 5 / Active Record 5。

假设我有两个模型:ProductWidgetProducthas_many小部件和Widget has_many产品通过称为products_widgets的联接表。

我想编写一个查询,以查找与both具有id=37的小部件相关的所有产品具有id=42的小部件。

我实际上有一个ID列表,但是如果我可以编写上面的查询,则通常可以解决此问题。

请注意,此查询更简单的版本是查找与[[0具有id=37的小部件相关的所有小部件具有id=42的小部件,您可以编写如下:] >Product.joins(:products_widgets).where(products_widgets: {widget_id: [37, 42]})

但这不是我所需要的。

这是使用PostgreSQL的Rails 5 / Active Record 5。假设我有两个模型:Product和Widget。一个产品has_many小部件和一个has_many小部件通过名为...

postgresql join activerecord ruby-on-rails-5
1个回答
0
投票
product .where('exists(select 1 from products_widgets where product_id = product.product_id and widget_id = ?)', 37) .where('exists(select 1 from products_widgets where product_id = product.product_id and widget_id = ?)', 42)

我认为使用.arel.exist也可能有效:

product
    .where(products_widgets.where('product_id = product.product_id and widget_id = ?', 37).arel.exists
    .where(products_widgets.where('product_id = product.product_id and widget_id = ?', 42).arel.exists
© www.soinside.com 2019 - 2024. All rights reserved.