在插入之前在两个表之间建立关联

时间:2019-06-03 07:20:02

标签: elixir phoenix-framework ecto

我有用户表和角色表。在用户表中引用角色表的外键角色roes_id退出。 在将数据插入到user_profile表中之前,我必须在两个表之间建立build_association。

我正在尝试使用Ecto.Multi.merge进行操作,但是有一些错误。它不起作用。我在错误的地方不知道。 据我介绍,Ecto.Multi.merge函数采用从函数返回的多对象。 直接传递功能无效。

<button class="testspeech">
            play/pause
</button>

这是一段代码。请帮我。我是这种语言的新手

每当我尝试使用邮递员运行此程序时...显示此错误

 def create_user_profile(profile_info, dealer_id) do
    import Sage
    client_id = Map.get(profile_info, "client_id")
    type = Map.get(profile_info, "user_type")
    role_name = Map.get(profile_info, "role_name")
    role_struct = Repo.get_by(Roles, role_name: role_name)

    Ecto.Multi.merge(Repo.get_by(Roles, role_name: role_name), fn %{role: role}->
    user_role = Ecto.build_assoc(role, :user_profile)|> UserProfile.changeset(profile_info)
    Ecto.Multi.new()
    |> Ecto.Multi.insert(:user_role, user_role)end)
    |> Ecto.Multi.merge(fn %{user: user} ->
      bank_detail =
        Ecto.build_assoc(user, :bank_details)
        |> BankDetails.changeset(profile_info)

      Ecto.Multi.new()
      |> Ecto.Multi.insert(:bank_detail, bank_detail)
    end)

1 个答案:

答案 0 :(得分:2)

从错误消息中可以看出,Repo.get_by/2返回%Accreditor.Role.Roles{}结构,该结构没有role字段。并且您正在尝试将其传递给接受要在%{role: role}上进行模式匹配的参数的函数,该参数显然会失败。

Ecto.Multi.merge(%Accreditor.Role.Roles{
  __meta__: #Ecto.Schema.Metadata<:loaded, "roles">,
  id: 1,
  inserted_at: ~N[2019-05-31 07:21:21],
  permissions: #Ecto.Association.NotLoaded<[...]>,
  role_name: "SUPER",
  updated_at: ~N[2019-05-31 07:21:21],
  user_profile: #Ecto.Association.NotLoaded<[...]>,
  user_type: #Ecto.Association.NotLoaded<[...]>,
  user_type_id: 1}, #Function[...]}

您还没有发布架构,所以我只能猜测您的Roles架构可以访问role,有点像

roles = Repo.get_by(Roles, role_name: role_name)
Ecto.Multi.merge(get_role(roles), fn role -> ... end)

将解决此问题。