Заменить определенные значения в структуре с пользовательскими значениями - PullRequest
0 голосов
/ 04 сентября 2018

У меня есть различные структуры, возвращенные из базы данных, и я хочу заменить значение Ecto.Assoication.Notloaded на какое-то пользовательское значение, например not loaded, во всех них.

Это одна запись

 unit = %{
  __meta__: #Ecto.Schema.Metadata<:loaded, "units">,
  cdc_location_class_id: nil,
  description: "",
  facility: #Ecto.Association.NotLoaded<association :facility is not loaded>,
  facility_id: 2215,
  id: 719,
  is_active: true,
  name: "Unit",
  rooms: #Ecto.Association.NotLoaded<association :rooms is not loaded>
}

Это карта, которую я хочу

 unit = %{
  __meta__: #Ecto.Schema.Metadata<:loaded, "units">,
  cdc_location_class_id: nil,
  description: "",
  facility: "not loaded">,
  facility_id: 2215,
  id: 719,
  is_active: true,
  name: "Unit",
  rooms: "not loaded"
}

Есть предложения?

Спасибо

Ответы [ 3 ]

0 голосов
/ 04 сентября 2018

Вы можете попробовать что-то вроде этого:

unit = %{
  __meta__: #Ecto.Schema.Metadata<:loaded, "units">,
  cdc_location_class_id: nil,
  description: "",
  facility: #Ecto.Association.NotLoaded<association :facility is not loaded>,
  facility_id: 2215,
  id: 719,
  is_active: true,
  name: "Unit",
  rooms: #Ecto.Association.NotLoaded<association :rooms is not loaded>
}

unit = case Ecto.assoc_loaded?(unit.facility) do
  false -> Map.put(unit, :facility, "not loaded")
  _ -> unit
end
0 голосов
/ 04 сентября 2018

Я бы использовал :maps.map/2, сопоставление с образцом в аргументе значения и заменил бы его при необходимости:

new_unit =
  :maps.map(fn
    _, %Ecto.Association.NotLoaded{} -> "not loaded"
    _, value -> value
  end, unit)

Если вам нужно запустить это в списке карт, просто поместите вышеупомянутое в функцию и используйте Enum.map/2.

0 голосов
/ 04 сентября 2018

, поскольку структуры - это просто карты, они работают с функциями из модуля Map

Таким образом, вы можете использовать Map.put для замены значения. Вот пример:

defmodule Test do
  defmodule User do
    defstruct name: "John", age: 27
  end

  def test() do
    a = %User{}
    IO.inspect a
    a = Map.put(a, :name, "change")
    IO.inspect a
  end

end

Test.test()
...