2016-09-02 9 views
1

私はRuby on Rails APIをElixirとPhoenixに変換しています。私のPostgresデータベースには、jsonbのカラムタイプのテーブルがあります。 jsonのキーの1つは色の配列です。たとえば、:Elixir Ecto - PostgreSQL jsonb関数

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

私がEctoからやりたいことは、赤または青の色を含むすべてのレコードを照会することです。基本的に、このクエリを再作成します。

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

私はエクトでこのクエリを構築するいくつかの困難を抱えています。ここで私が持っているものです。

注:「値」は予想通りこれは現在動作していない色

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

私は私の問題への解決策を発見しました。

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

    from c in query, 
    where: fragment("data->'colors' \\?| ?", ^colors)) 
end 
関連する問題