Ecto запрос, чтобы получить все значения, которые удовлетворяют всем значениям в array_aggregator, а не просто любым? - PullRequest
0 голосов
/ 22 мая 2019

Интересно, может ли кто-нибудь помочь мне с проблемой агрегатора массивов

У меня есть запрос, который выполняет объединение с использованием таблицы объединения, затем он фильтрует все значения, которые находятся внутри данного массива, и отфильтровывает значениякоторые находятся в другом массиве.

Код выглядит следующим образом:

      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С, не просто А и не просто С.

У кого-нибудь есть идеи?

1 Ответ

0 голосов
/ 23 мая 2019

Полагаю, вы хотите использовать оператор @> вместо оператора перекрытия &&:

having(fragment("array_agg(t2.name) @> (?)::varchar[]", ^good_ingredients))

Ссылка: https://www.postgresql.org/docs/current/functions-array.html#ARRAY-OPERATORS-TABLE

...