Интересно, может ли кто-нибудь помочь мне с проблемой агрегатора массивов
У меня есть запрос, который выполняет объединение с использованием таблицы объединения, затем он фильтрует все значения, которые находятся внутри данного массива, и отфильтровывает значениякоторые находятся в другом массиве.
Код выглядит следующим образом:
Product
|> join(:inner, [j], jt in "job_tech", on: j.id == jt.product_id)
|> join(:inner, [j, jt], t in Tech, on: jt.ingredient_id == t.id)
|> group_by([j], j.id)
|> having_good_ingredients(good_ingredients)
|> not_having_bad_ingredients(bad_ingredients)
С having_good_ingredients
выглядит так:
def having_good_ingredients(query, good_ingredients) do
if Enum.count(good_ingredients) > 0 do
query
|> having(fragment("array_agg(t2.name) && (?)::varchar[]", ^good_ingredients))
else
query
end
end
Это работает, но будетзахватить все значения, которые удовлетворяют любому из значений в массиве good_stacks, где я хочу, чтобы они удовлетворяли, только если все стеки работают, т.е. если у меня есть [A, C] в моем массиве, я хочу вернуть значения, которые имеют A ANDС, не просто А и не просто С.
У кого-нибудь есть идеи?