繁体   English   中英

Elixir Ecto-PostgreSQL jsonb函数

[英]Elixir Ecto - PostgreSQL jsonb Functions

我正在将Ruby on Rails API转换为Elixir和Phoenix。 在我的Postgres数据库中,我有一个带有jsonb列类型的表。 json中的键之一是颜色数组。 例如:

{"id": 12312312, "colors": ["Red", "Blue", "White"]}

我想从Ecto进行的工作是查询我的表以查找包含红色或蓝色的所有记录。 本质上,重新创建此查询:

select * from mytable where data->'colors' ?| array['Red', 'Blue']

我在用Ecto构造此查询时遇到一些困难。 这是我所拥有的:

注意:“值”将是管道分隔的颜色列表

  def with_colors(query, value) do
    colors = value 
      |> String.split("|")
      |> Enum.map(fn(x) -> "'#{x}'" end)
      |> Enum.join(", ")

    # colors should look like "'Red', 'Blue'"

    from c in query,
    where: fragment("data->'colors' \\?| array[?]", ^colors))
  end

目前,此功能无法正常运行。 我在替换问号方面遇到问题,因为它似乎在我的领域周围加上了其他引号。 使用此片段的正确方法是什么? 还是有更好的方法?

我将再次遇到这个问题,因为我还将不得不重新创建此查询:

select * from mytable where data->'colors' @> '["Red", "Blue"]'

我已经找到解决问题的办法。

def with_colors(query, value) do
  colors = value 
    |> String.split("|")

  from c in query,
  where: fragment("data->'colors' \\?| ?", ^colors))
end

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM