Как получить идентификатор из предыдущего вставленного ключа таблицы по Ecto Multi - PullRequest
0 голосов
/ 16 апреля 2020

Я хотел бы получить идентификатор из первичного ключа предыдущей вставленной таблицы по Ecto Multi.

Сначала я вставляю в основную таблицу. тогда в таблице подробностей необходимо А.ид. Я попытался следующий код.

Multi.new()
  |> Multi.insert(:insert, main)
  |> Multi.insert_all(:insert_all, B, details)
  |> Repo.transaction()

Однако я не знаю, как получить A.id для таблицы вставки B. Что я должен сделать для этого?

Ответы [ 2 ]

1 голос
/ 20 апреля 2020

Вы можете сделать что-то вроде следующего примера, который создает новую запись User и новую запись Email (где запись email связана с родительской записью user через внешний ключ user_id) .

alias Ecto.Multi

user = get_user_params_from_form() # <-- or where-ever you are getting data
email = get_email_params_from_form()

Multi.new()
    |> Multi.insert(:user, User.changeset(%User{}, user))
    |> Multi.insert(
      :email,
      # Capture the id from the previous operation
      fn %{
           user: %User{
             id: user_id
           }
         } ->
        Email.changeset(%Email{user_id: user_id}, email)
      end
    )

Я думаю, что это демонстрирует тип отношений, которые вы описали. Надеюсь, это поможет!

0 голосов
/ 16 апреля 2020

Я думаю, вы можете использовать Multi.merge , чтобы использовать результат первого мульти во втором мульти.

Это пример из документов:

multi =
  Ecto.Multi.new()
  |> Ecto.Multi.insert(:post, %Post{title: "first"})

multi
|> Ecto.Multi.merge(fn %{post: post} ->
  # Here, post is the Post inserted in the first multi.
  Ecto.Multi.new()
  |> Ecto.Multi.insert(:comment, Ecto.build_assoc(post, :comments))
end)
|> MyApp.Repo.transaction()

Обновление: я добавил комментарий о post (ваша A модель), которая была создана в первом мульти. Вы можете использовать post.id и назначить его соответствующим комментариям (ваша B модель).

...