Ex_machina изменяет данные при создании - PullRequest
0 голосов
/ 27 августа 2018

Вот моя фабрика: (using the ex_machina package)

def question_factory do
    %Question{
      active: true,
      type: "NBA",
      description: "player points",
      reserved: %{
        information: %{
          game_id: Ecto.UUID.generate,
          player_id: Ecto.UUID.generate,
          player_name: "Lebron James"
        },
        inputs: [
          %{
            type: "text",
            label: "Player Points",
          }
        ]
      }
    }
end

Схема вопроса

schema "questions" do
  field(:active, :boolean)
  field(:type, :string)
  field(:description, :string)
  embeds_one(:reserved, Statcasters.Questions.Reserved)

  timestamps()
end

Зарезервированная схема

embedded_schema do
  field(:information, :map)
  field(:inputs, {:array, :map})
end

Вот мои настройки теста:

question = insert(:question, reserved: %{ information: %{player_name: "steve"}})

В этом примере я хочу only обновить player_name для карты reserved. Но когда я использую вышеуказанную настройку, структура вопроса выглядит так:

%MyApp.Question{
  __meta__: #Ecto.Schema.Metadata<:loaded, "questions">,
  active: true,
  description: "player points",
  id: 125,
  inserted_at: ~N[2018-08-27 14:47:42.075169],
  reserved: %MyApp.Questions.Reserved{
    information: %{player_name: "steve"},
    inputs: nil
  },
  type: "NBA",
  updated_at: ~N[2018-08-27 14:47:42.075182]
}

Я хочу, чтобы это выглядело так:

%MyApp.Question{
  __meta__: #Ecto.Schema.Metadata<:loaded, "questions">,
  active: false,
  description: "player points",
  id: 122,
  inserted_at: ~N[2018-08-27 14:39:52.672051],
  reserved: %MyApp.Questions.Reserved{
    information: %{
      game_id: "1ab95979-329a-488c-9d5f-22bed4f2b985",
      player_id: "07cc1588-68eb-43b6-afa6-483fa3005cb2",
      player_name: "Steve"
    },
    inputs: [%{label: "Player Points", type: "text"}]
  },
  type: "NBA",
  updated_at: ~N[2018-08-27 14:39:52.672058]
}

Опять же, проблема в том, что он заменяет все значения в reserved Я хочу просто изменить player_name, как я могу добиться этого, используя elixir и ex_machina? Спасибо за любую помощь.

1 Ответ

0 голосов
/ 28 августа 2018

В настоящее время вы явно указываете ex_machina, чтобы установить reserved, как указано. Когда нужно обновить запись, нужно ExMachina.build/2 ее, обновить и сохранить обратно. Или, альтернативно, ExMachina.Ecto.insert/2 эшафот, а затем обновите его, но это не предназначено для ex_machina.

Тем не менее, следующее должно работать.

:question
|> build()
|> put_in(~w|reserved information player_name|a, "steve")
|> insert()

Подробнее см. Гибкие заводы с трубами .

...