2016-09-02 4 views
1

Я работаю над преобразованием API Ruby on Rails в Elixir и Phoenix. В моей базе данных Postgres у меня есть таблица с типом столбца jsonb. Один из ключей в json - это массив цветов. Например:Elixir Ecto - PostgreSQL jsonb Функции

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

ответ

1

Я нашел решение моей проблемы.

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

    from c in query, 
    where: fragment("data->'colors' \\?| ?", ^colors)) 
end 
Смежные вопросы