У меня есть три модели: 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_1
и outfit_3
- я бы хотел, чтобы он возвращал только outfit_3
, что является точным совпадением.
UPDATE (Подробнее)
Вызов запроса с массивом из трех продуктов дает следующий запрос:
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 )