Экто JSONB массив и карта приведена проблема - PullRequest
0 голосов
/ 08 апреля 2019

Я хочу хранить данные, используя jsonb, который может быть либо массивом, либо картой.Исходные данные поступают либо в виде массива, либо в виде карты, и мы хотим объединить их на сервере, чтобы клиентская часть могла работать с одним типом.Есть ли способ / обходной путь, который я могу использовать, хранить и извлекать как json / map, так и типы массивов, которые действительны для типа jsonb postgres?

Я пытался использовать source: для копирования в тип массива *Поле 1004 * до вызова конвейера приведения, если я получаю массив в params:

condition: Map.has_key?(params, "value") && is_list(value)

Я успешно могу сохранить данные, но при получении из БД я получаю ошибку приведения

field(:value, :map)
field(:value_array, {:array, :integer}, source: :value)

Примечание: Ecto версия> 3 и postgres 10

1 Ответ

0 голосов
/ 09 апреля 2019

Решением было определение пользовательских типов экто , которые будут принимать и загружать как массивы, так и карты

defmodule HaiData.Jsonb do
  @behaviour Ecto.Type
  def type, do: :map

  # Provide custom casting rules.
  def cast(data) when is_list(data) or is_map(data) do
    {:ok, data}
  end


  # Everything else is a failure though
  def cast(_), do: :error

  # When loading data from the database, we are guaranteed to
  # receive a map or list
  def load(data) when is_list(data) or is_map(data) do
    {:ok, data}
  end

  # When dumping data to the database, we *expect* a map or list
  # so we need to guard against them.
  def dump(data)  when is_list(data) or is_map(data), do: {:ok, data}
  def dump(_), do: :error
end

Кредит переходит к идиоту - пользователю эликсира

...