Elixir Ecto - PostgreSQL jsonb函数

时间:2016-09-02 00:24:55

标签: postgresql elixir phoenix-framework ecto

我正在将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构建此查询时遇到一些困难。这就是我所拥有的:

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

  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"]'

1 个答案:

答案 0 :(得分:4)

我找到了解决问题的方法。

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

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