Postgrex - запрос, возвращающий неоднозначную ошибку ссылки на столбец - PullRequest
1 голос
/ 21 мая 2019

У меня есть следующие запросы:

def user_contacts(provider_id, filter) do
  query =
    from(
      u in User,
      preload: [:groups],
      where: u.provider_id == ^provider_id and u.type != "company"
    )

  query
  |> filter_sector(filter)
  |> filter_availability(filter)
end

defp filter_sector(query, %{"sector" => "Asset Management & Investment Funds"}) do
  query
  |> join(:inner, [u], p in Profile, p.user_id == u.id)
  |> where([u, p], fragment("(sectors->>'asset' = ?)", "true"))
end

defp filter_sector(query, _), do: query

defp filter_availability(query, %{"availability" => "now"}) do
  query
  |> join(:inner, [u], p in Profile, p.user_id == u.id)
  |> where([u, p], ^Date.utc_today >= p.placement_availability)
end

defp filter_availability(query, _), do: query

Я получаю следующую ошибку: ERROR 42702 (ambiguous_column): column reference "sectors" is ambiguous.sectors - это встроенная схема в Profile.

Моя попытка исправить это - переработать структуру запроса filter_sector в следующее:

from(
  q in query,
  join: p in Profile,
  on: p.user_id == q.id,
  where: fragment("(sectors->>'asset' = ?)", "true")
)

, но я до сих порполучить ту же ошибку.Странно, когда фильтр имеет только значение «сектор» или значение «доступность», в котором работает запрос, но когда присутствуют оба значения, возникает ошибка.

1 Ответ

1 голос
/ 21 мая 2019

Не глядя на весь запрос, я могу только строить догадки, но, скорее всего, в этом объединении есть еще одна таблица с полем sectors. Или, возможно, профили соединяются дважды. Если вы включите полное сообщение об ошибке вместе со стековой трассировкой, а также сгенерированный запрос, это поможет подтвердить это подозрение.

Если это так, вы можете исправить это, указав в поле sectors полный текст, который является предпочтительным способом написания запросов:

query
|> join(:inner, [u], p in Profile, p.user_id == u.id)
|> where([u, p], fragment("(?->>'asset' = ?)", p.sectors, "true"))

Теперь не должно быть никакой двусмысленности.

...