Я работаю над преобразованием 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"]'