Postgrex-查询返回不明确的列引用错误

时间:2019-05-21 07:00:26

标签: elixir ecto postgrex

我有以下查询:

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 ambiguoussectorsProfile中的嵌入式架构。

我要解决此问题的方法是将filter_sector查询的结构改编为:

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

但是我仍然遇到相同的错误。奇怪的是,当过滤器仅具有“ sector”值或“ availability”值时,查询将起作用,但是当同时存在两个值时,就会出现错误。

1 个答案:

答案 0 :(得分:1)

如果不查看整个查询,我只能推测,但是您可能在其中包含带有sectors字段的另一个表中。或个人资料被加入两次。如果您将完整的错误消息与stacktrace一起包括在内,以及所生成的查询,则将有助于确认这种怀疑。

在这种情况下,您可以通过完全限定sectors字段来解决此问题,这是编写查询的首选方式:

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

现在不应该有歧义。

相关问题