gpt4 book ai didi

ruby-on-rails - ActiveRecord 连接 - 仅返回完全匹配

转载 作者:行者123 更新时间:2023-12-04 10:04:03 25 4
gpt4 key购买 nike

我有三个型号,Outfit , Product ,和一个连接模型 OutfitProduct (Outfit 通过 OutfitProducts 有很多产品)。

我想找到只包含完全匹配的产品的服装。

到目前为止我有这个

def by_exact_products(products)
joins(outfit_products: :product)
.where(outfit_products: { product: products })
.group("outfits.id")
.having('count(outfits.id) = ?', products.size)
end

以上返回任何包含我正在搜索的产品的服装,即使它不是完全匹配的。我希望它只返回完全匹配的服装。

例子:
假设我们有由以下产品组成的以下服装:
outfit_1.products = [product_1, product_2, product_3, product_4]
outfit_2.products = [product_1, product_2]
outfit_3.products = [product_1, product_2, product_3]

如果我通过了 [product_1, product_2, product_3]到我的查询,它会返回 outfit_1outfit_3 - 我希望它只返回 outfit_3这是完全匹配。

更新(更多信息)

使用包含三个产品的数组调用查询会生成以下查询:
SELECT "outfits".* 
FROM "outfits"
INNER JOIN "outfit_products"
ON "outfit_products"."outfit_id" = "outfits"."id"
INNER JOIN "products"
ON "products"."id" = "outfit_products"."product_id"
WHERE "outfit_products"."product_id" IN ( 18337, 6089, 6224 )
GROUP BY outfits.id
HAVING ( Count(outfits.id) = 3 )

最佳答案

让我们首先看看为什么会发生这种情况。您使用以下场景:

outfit_1.products = [product_1, product_2, product_3, product_4]
outfit_2.products = [product_1, product_2]
outfit_3.products = [product_1, product_2, product_3]


这将有以下 outfit_products table :

outfit_id | product_id
----------|-----------
1 | 1
1 | 2
1 | 3
1 | 4
2 | 1
2 | 2
3 | 1
3 | 2
3 | 3

添加限制时:

WHERE "outfit_products"."product_id" IN ( 1, 2, 3 )

它将消除该行:

outfit_id | product_id
----------|-----------
1 | 4

并为产品 1 留下 3 条记录,当您对记录进行分组和计数时,最终产品 1 的结果值为 3。这意味着当前查询将只检查所提供的最少产品(也就是确保所有产品)提供的产品存在)。

要同时消除产品数量多于提供的产品的记录,您必须添加第二个计数。计算没有上述限制的产品。
def by_exact_products(products)
# all outfits that have at least all products
with_all_products = joins(outfit_products: :product)
.where(outfit_products: { product: products })
.group("outfits.id")
.having('count(outfits.id) = ?', products.size)

# all outfits that have exactly all products
joins(outfit_products: :product)
.where(id: with_all_products.select(:id))
.group("outfits.id")
.having('count(outfits.id) = ?', products.size)
end

这将选择至少提供所有产品的所有服装,并计算其产品总数。

关于ruby-on-rails - ActiveRecord 连接 - 仅返回完全匹配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61679259/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com