如何使用通道插入外键 ID?

How can I insert foreign key id through using channel?

我有表格,CategorySubcategory

Category 有很多 subcategoriesSubcategory 属于 category.

在我的频道handle_in中,有一个插入子类别的功能,如下所示。

def handle_in("create:subcategory", %{"name" => name, "category_id" => category_id}, socket) do 
changeset = Subcategory.changeset(%Subcategory{name: name, category_id: category_id})
|>Repo.insert

subcategories = from(p in Pos8.Subcategory, select: map(p, [:id, :name, :category_id])) |> Repo.all
response = %{subcategories: subcategories}

  broadcast! socket, "subcategories:updated", response

 {:noreply, socket}
end

所以基本上,我想做的是通过 namecategory_id 创建子类别。但是它触发了一个错误 Myapp.Subcategory.category_id in insert does not match type :id (ecto) lib/ecto/repo/schema.ex:691: Ecto.Repo.Schema.dump_field!/6 (ecto) lib/ecto/repo/schema.ex:700: anonymous fn/6 in Ecto.Repo.Schema.dump_fields!/5

如何在创建subcategory时插入category_id

提前致谢..

这可能有效:

import Ecto.Changeset
parent = Repo.get!(Category, category_id)
subcategory = cast(%Subcategory{}, %{name: name})
              |> put_assoc(:category, parent) 
              |> Repo.insert!

如果您进行测试,您会注意到 category_id 是一个字符串。当您尝试使用 Repo.get/3 之类的方法在数据库中 查找 一个值时,这是可以的,但不幸的是,当您尝试插入原始值时,它就不行了。

但是,您应该能够执行 String.to_integer(category_id) 之类的操作,并且您将能够很好地插入它。

所以你最后的插入行看起来像

changeset = 
  Subcategory.changeset(%Subcategory{name: name, 
                                     category_id: String.to_integer(category_id)})
  |> Repo.insert()

正如@Dogbert 在评论中指出的那样,您可以让变更集函数处理转换。

changeset = 
  Subcategory.changeset(%Subcategory{}, %{name: name, category_id: category_id})
  |> Repo.insert()

这样做的好处是不仅可以处理整数类型。